2016-10-07 194 views
5

在Android應用程序的主要活動中,我檢查權限(Manifest.permission.MANAGE_DOCUMENTS),檢測到我沒有它們,並調用requestPermisions。 然後在onRequestPermissionResult我幾乎立即得到拒絕的權限,沒有對話框顯示。Android權限自動被拒絕請求MainActivity中的權限

我已經證實在同一應用程序的其他活動相同的權限(通過requestPermissions再次,它的工作原理),所以我預計將存放在此決定(該會話,或其他),我從來沒有選擇否認許可。無論哪種方式,權限對話框都不顯示,權限被自動拒絕。

到目前爲止,我已經在Android 7和6(API 24和23)的模擬器上測試了這一點。

我曾嘗試:

我很爲難......

這裏是許可請求(參見代碼註釋):

private fun askForPermissionOrSendRequest(view: View, permission: String) { 
    if (checkSelfPermission(permission) == PackageManager.PERMISSION_DENIED) { 
     if (shouldShowRequestPermissionRationale(permission)) { 
      cachedView = view 
      val explanationDialog = AlertDialog.Builder(this).setMessage("We need permissions to read your storage in order to show your profile image.").setOnDismissListener { 
       requestPermissions(
         arrayOf(permission), 
         BSMainActivity.permissionRequestSendProfilePic 
       ) 
      }.create() 
      explanationDialog.show() 

     } else { 
      cachedView = view 
      // this branch is always hit - the permission seems to be missing every time 
      requestPermissions(
        arrayOf(permission), 
        BSMainActivity.permissionRequestSendProfilePic 
      ) 
     } 
    } else { 
     sendRequest(view) 
    } 
} 

我立即得到結果處理沒有一個對話框顯示出來了問我的權限。我可能會也可能不會確認同一應用程序的另一個(兒童)活動中的相同權限(似乎沒有區別)。

override fun onRequestPermissionsResult(requestCode: Int, 
             permissions: Array<String>, 
             grantResults: IntArray 
) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults) 

    when (requestCode) { 
     BSMainActivity.permissionRequestSendProfilePic -> { 
      // This gets hit, MANAGE_DOCUMENTS was denied 
      if (permissions.contains(Manifest.permission.MANAGE_DOCUMENTS) && grantResults[permissions.indexOf(Manifest.permission.MANAGE_DOCUMENTS)] == PackageManager.PERMISSION_DENIED) { 
       Log.w(logName, "Permission to open image was denied while sending a tag request: %s %s".format(
         permissions.joinToString(",", "[", "]"), 
         grantResults.joinToString(",", "[", "]") 
       )) 
      } 

      // send request regardless of the result for now 
      sendRequest(cachedView) 
     } 
    } 
} 

在我的表現,我有以下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="me.monomon.bs"> 

    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/> 

回答

4

只有dangerous permissions可以在運行時請求並MANAGE_DOCUMENTS是不是一個危險的權限。

由於每MANAGE_DOCUMENTS documentation

此權限只能由平臺文檔管理應用程序請求。此權限不能授予第三方應用程序。

+0

但再怎麼都應該讀的意向選定的文件作爲'intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)' – RecencyEffect

+1

這將是一個完全不同的問題的應用程序。如果您獲得讀取URI權限,則可以調用[openInputStream](https://developer.android.com/reference/android/content/ContentResolver.html#openInputStream(android.net.Uri))來訪問所選文件的內容。 – ianhanniballake

+0

我面臨着與互聯網許可相同的問題......我該如何處理? @ianhanniballake –