我试图设置我的应用程序使用运行时权限。我已经得到了请求对话框显示好了,但是当我选择"接受"对话框,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_DOCUMENTS
是Protection 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);