Android运行时权限导致ANR太多

时间:2018-03-15 06:38:37

标签: android unity3d google-play runtime-permissions

要使我的应用程序适用于所有Android版本,我必须在运行时从Android M和Onwards请求权限。我在Unity 5.6.2中开发 在我的应用程序的当前版本之前,Google Play控制台上没有报告任何ANR,但在推送最新更新后,ANR的数量已经增加。 我只创建了一个自定义的Activity类,并在其中添加了权限代码。我无法理解可能出现的问题以及为什么会出现这么多ANR。

请参阅下面的代码,询问运行时权限,并告诉我应该为我的问题实现什么解决方案。您能否在代码中看到可能导致此问题的任何内容?

public class CustomUnityPlayerActivityForPermissions extends UnityPlayerActivity {

private String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE};
private ArrayList<String> permissionsToRequest = new ArrayList<String>();


@Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    {
        AskForPermissions();
    }
    else{
        Log.d("TestApp","No Need to Ask for Permissions API Levels < 23");

    }
}

public void AskForPermissions(){

    Log.d("TestApp","in AskPermission");
    for(int i = 0 ; i< permissions.length ; i++)

        if (ContextCompat.checkSelfPermission(UnityPlayer.currentActivity,
            permissions[i]) != PackageManager.PERMISSION_GRANTED){
            permissionsToRequest.add(permissions[i]);

        }
    if(permissionsToRequest.size()>0) {

        Log.d("TestApp", "in AskPermission " + permissionsToRequest.size());
        ActivityCompat.requestPermissions(UnityPlayer.currentActivity, permissionsToRequest.toArray(new String[permissionsToRequest.size()]), 1);
        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }

}

@Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {

            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                finish();
            }
            return;


        // other 'case' lines to check for other
        // permissions this app might request.

}

}

1 个答案:

答案 0 :(得分:0)

我想知道ANR是否是由以下部分引起的:

// permission was granted, yay! Do the
// contacts-related task you need to do.

如果这些任务很慢,但是你正在从框架中执行它们的所有回调线程(这可能是从onRequestPermissionsResult()调用的地方),它可能会导致你的应用无响应。如果你改变了任务要求权限是异步任务,或者在回调中找到其他不做这些任务的方法,你会阻止ANR发生吗?