2015-11-02 87 views
11

在Android OS 4.0上運行我的應用程序,並要求READ_EXTERNAL_STORAGE許可使用時,我有一個問題:的Android棉花糖權限模型始終未授予

ActivityCompat.requestPermissions(ctx, requestedPermissions, requestCode); 

我總是在回調

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
     @NonNull int[] grantResults) { 

grantResults != PackageManager.PERMISSION_GRANTED 

使用ActivityCompat.checkSelfPermission檢查權限始終返回permissionDenied

它通過請求系統對話框的權限在OS 6.0上運行良好。 Android OS 4.x例外4.0總是授予權限。 OS 4.0的其他權限(相機,日曆,聯繫人,電話)行爲良好,除了READ_EXTERNAL_STORAGE導致此問題。

也許操作系統的問題?

+0

這很奇怪。您可以嘗試使用 .requestPermission(requestedPermissions,requestCode)的正常權限方法; – dex

+1

http://stackoverflow.com/questions/32129716/how-does-storage-access-change-on-android-6 –

+0

@dex問題是活動相關的權限方法只能通過API 23 – skirix

回答

11

What ActivityCompat.requestPermissions() does是:

  • 電話接到真正requestPermissions()如果你是在Android 6.0以上版本,或

  • 使用PackageManager看到,如果你持有舊版Android

    的請求的權限

READ_EXTERNAL_STORAGE的問題是,它是在API級別16中添加(安卓4.1 )。你不能在較舊的Android版本上保留它,原因很簡單,因爲它不存在。

或者:

  • 設置你的minSdkVersion至16,或

  • 把自己的邏輯來處理這種情況,認識到READ_EXTERNAL_STORAGE是API級別16

之前無關
+0

現在一切都清楚了!謝謝 – skirix

+7

一個簡單的解決方法是請求'WRITE_EXTERNAL_STORAGE'權限,而不是API 4。在M中,'WRITE'和'READ'位於同一個權限組中,因此請求前者將授予對後者的訪問權限以及。唯一的缺點是4.1之前的版本會發現需要新的權限,如果您以前只請求「READ」。 – Sebastiano

+1

@dextor:假設Android將始終要求用戶在權限組級別的權限,而不是權限的級別。我不會做出這樣的假設。 – CommonsWare