Android运行时权限——用户授予权限,而不是在onRequestPermissionsResult中接收它



我试图设置我的应用程序使用运行时权限。我已经得到了请求对话框显示好了,但是当我选择"接受"对话框,onRequestPermissionsResult被调用,grantResults不显示permission_granting,应用程序没有得到权限。下面是我请求许可的方式:

 ActivityCompat.requestPermissions((Activity) contnext,
     new String[]{Manifest.permission.MANAGE_DOCUMENTS, Manifest.permission.READ_EXTERNAL_STORAGE},
     MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);

和回调:

public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {
    switch (requestCode){
        case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE:
            if (grantResults.length > 0 
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // do good stuff
                Log.i("net.bradmont.prayson", "Permissions granted by user");
            } else {
                Log.i("net.bradmont.prayson", "Permissions refused by user");
                Log.i("net.bradmont.prayson", "grantResults.length " + grantResults.length);
                for (int i = 0; i < grantResults.length; i++){
                Log.i("net.bradmont.prayson", "grantResults[" + i +"]" + grantResults.length);
                }
                Snackbar snackbar1 = Snackbar.make(mCoordinator, 
                        R.string.cant_open_file_no_permission, Snackbar.LENGTH_LONG);
                snackbar1.show();
            }
    }
}

结果是,在接受权限对话框后,应用程序显示错误的小吃栏。以下是在logcat中显示的内容:

net.bradmont.prayson  I  Permissions refused by user
                      I  grantResults.length 2
                      I  grantResults[0]2
                      I  grantResults[1]2

我甚至不知道2在granresults中表示什么;PackageManager文档中仅有的值为2的const是COMPONENT_ENABLED_STATE_DISABLED和GET_RECEIVERS。

这到底是怎么回事?

首先,在循环中反复打印int[] grantResults的长度而不是值。

for (int i = 0; i < grantResults.length; i++){
      Log.i("net.bradmont.prayson", "grantResults[" + i +"]" + grantResults.length);
}
应:

for (int i = 0; i < grantResults.length; i++){
      Log.i("net.bradmont.prayson", "grantResults[" + i +"]" + grantResults[i]);
}

其次,正如CommonsWare声明的Manifest.permission.MANAGE_DOCUMENTSProtection level: signature,这意味着This permission cannot be granted to third-party apps.参见MANAGE_DOCUMENTS的文档。

既然你的第一个请求是MANAGE_DOCUMENTS,难怪grantResults中的第一个值不是PackageManager.PERMISSION_GRANTED。我猜第二个值实际上是PERMISSION_GRANTED,对应于Manifest.permission.READ_EXTERNAL_STORAGE请求。

长话短说,去掉MANAGE_DOCUMENTS请求:

ActivityCompat.requestPermissions((Activity) context,
     new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
     MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);

最新更新