【问题标题】:Android Runtime Permissions Causing too Many ANRs导致过多 ANR 的 Android 运行时权限
【发布时间】:2018-03-15 06:38:37
【问题描述】:

为了让我的应用在所有 Android 版本上运行,我必须在运行时向 Android M 及更高版本请求权限。我正在 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.

}

}

【问题讨论】:

  • 根据我的个人经验,检查运行时权限的代码从未引起 ANR。我认为您的问题出在其他地方...
  • 但除了请求运行时权限之外,我没有做任何其他事情。
  • 我看不出上面有什么问题。您在 Play 管理中心中的 ANR 报告是否详细说明了发生 ANR 时发生的情况?如果可以,您可以在问题中分享吗?
  • 我可以分享,但这无济于事,那些是外来语言:)

标签: android unity3d google-play runtime-permissions


【解决方案1】:

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

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

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

【讨论】:

  • 所以你的意思是我应该请求作为异步任务的权限?
  • 不,我建议在获得权限请求的结果后,您应该在异步任务中做接下来想做的任何事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 2016-03-25
  • 1970-01-01
相关资源
最近更新 更多