我有一个名为getPermisions的方法,它使用名为hasPermissions的辅助方法。我在onCreate方法中调用getPermissions(),如下所示。 。 。
getPermissions();
//code here uses these permissions
camera = Camera.open(); //but this code executes async to getPermissions method
getPermissions的代码如下。 。 。
private boolean hasPermissions(Context context, String... permissions) {
if (context != null && permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
private void getPermissions()
{
//before we display setup dialog we must get permissions . . .
int PERMISSION_ALL = 1;
String[] PERMISSIONS = {
android.Manifest.permission.READ_PHONE_STATE,
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.CAMERA
};
if(!hasPermissions(this, PERMISSIONS)){
ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}
}
如果我正在逐步执行代码,但在实际运行应用程序时,getPermissions()代码与主UI线程异步运行,代码运行良好。因此,当我调用getPermissions()时,主线程继续使用我仍然要求的权限运行。
当用户回答所有三个对话框时,我需要保持主线程。怎么做到最好?
因此,当我调用getPermissions()时,主线程继续使用我仍然要求的权限运行。
好吧,requestPermissions()
异步工作,如果这就是你的意思。在封面下,它使用startActivityForResult()
来显示系统提供的权限对话框。
当用户回答所有三个对话框时,我需要保持主线程
那是不可能的。你永远不会得到权限对话框,更不用说结果了。
这也没有必要。
简而言之:
hasPermissions()
返回true
,则调用该方法getPermissions()
返回hasPermissions()
,请致电false
onRequestPermissionsResult()
调用该方法如果您不喜欢这样,那么a few dozen libraries旨在为使用运行时权限提供更简单的模式。也许其中一个会激起你的兴趣。
the documentation中介绍了运行时权限的使用。