在获得许可的同时举起东西

时间:2018-09-05 21:19:42

标签: android android-permissions ui-thread

我有一个名为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()时,主线程将继续使用我仍在请求的权限运行。

在用户回答所有三个对话框时,我需要按住主线程。如何做到最好?

1 个答案:

答案 0 :(得分:1)

  

因此,当我调用getPermissions()时,主线程将继续使用我仍在请求的权限运行。

好吧,requestPermissions()是异步的,如果这就是您的意思。在幕后,它使用startActivityForResult()来显示系统提供的权限对话框。

  

当用户回答所有三个对话框时,我需要按住主线程

那是不可能的。您将永远不会获得权限对话框,更不用说结果了。

也没有必要。

简而言之:

  • 将依赖于这些权限的代码放入方法中
  • 如果hasPermissions()返回true,请调用该方法
  • 如果getPermissions()返回hasPermissions(),请致电false
  • 如果用户授予了您请求的权限,请从onRequestPermissionsResult()调用该方法

如果您不喜欢这样做,那么a few dozen libraries旨在为使用运行时权限提供更简单的模式。也许其中一个会激起您的兴趣。

the documentation中介绍了运行时权限的使用。