要使我的应用程序适用于所有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.
}
}
答案 0 :(得分:0)
我想知道ANR是否是由以下部分引起的:
// permission was granted, yay! Do the
// contacts-related task you need to do.
如果这些任务很慢,但是你正在从框架中执行它们的所有回调线程(这可能是从onRequestPermissionsResult()
调用的地方),它可能会导致你的应用无响应。如果你改变了任务要求权限是异步任务,或者在回调中找到其他不做这些任务的方法,你会阻止ANR发生吗?