2016-09-21 119 views
0

我试图设置我的应用程序以使用运行时权限。我的请求对话框显示正常,但是当我在对话框中选择“接受”,并调用onRequestPermissionsResult时,grantResults不显示PERMISSION_GRANTED,并且应用程序没有获得权限。下面是我如何请求权限:Android运行时权限 - 用户授予权限,没有在onRequestPermissionsResult中接收它的权限

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将在grantResults表示; PackageManager文档中值为2的唯一常量是COMPONENT_ENABLED_STATE_DISABLED和GET_RECEIVERS。

这到底是怎么回事?

+2

摆脱MANAGE_DOCUMENTS'的' - 因为你不能认为反正权限 - 看看会发生什么。 – CommonsWare

回答

1

首先,您在循环中重复输入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.看到documentation for 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); 
+0

那么......第一个问题是尴尬...... – Brad

+0

所以它现在似乎工作。谢谢。 – Brad

+0

哈哈没问题。很高兴它的工作! –