我有一个名为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()代码与Main UI线程异步运行。因此,当我调用getPermissions()时,主线程将继续使用我仍在请求的权限运行。
在用户回答所有三个对话框时,我需要按住主线程。如何做到最好?
答案 0 :(得分:1)
因此,当我调用getPermissions()时,主线程将继续使用我仍在请求的权限运行。
好吧,requestPermissions()
是异步的,如果这就是您的意思。在幕后,它使用startActivityForResult()
来显示系统提供的权限对话框。
当用户回答所有三个对话框时,我需要按住主线程
那是不可能的。您将永远不会获得权限对话框,更不用说结果了。
也没有必要。
简而言之:
hasPermissions()
返回true
,请调用该方法getPermissions()
返回hasPermissions()
,请致电false
onRequestPermissionsResult()
调用该方法如果您不喜欢这样做,那么a few dozen libraries旨在为使用运行时权限提供更简单的模式。也许其中一个会激起您的兴趣。
the documentation中介绍了运行时权限的使用。