2017-05-30 46 views
3

我想檢查是否需要Manifest.permission.READ_EXTERNAL_STORAGE從給定的Uri中讀取。檢查是否需要READ_EXTERNAL_STORAGE權限才能從特定的Uri中讀取

這是正確處理傳入意圖到我的應用程序所需的。例如,如果我從WhatsApp將圖像分享給我的應用程序,並且我的應用程序沒有讀取權限即可。自從WhatsApp允許我閱讀這個Uri以來,我仍然可以從這個Uri讀取。然而,Google照片將Uris作爲外部存儲Uri共享,並從中讀取,因此我需要提示用戶爲我的應用授予從外部存儲讀取的權限。

我知道我總是可以要求用戶提供我的應用程序讀取權限,但是我希望儘可能避免這種情況。

+0

你可以檢查URI包含'環境。 getExternalStorage ()',並根據它請求權限。 –

回答

1

我不知道這是否是處理它的最佳方式,但你可以趕上SecurityException,然後請求所需的權限:

try { 
    getContentResolver().query(uri, ...); 
} catch (SecurityException e) { 
    // Request storage perms here 
    ActivityCompat.requestPermissions(this, new String[] { 
     Manifest.permission.READ_EXTERNAL_STORAGE 
    }, REQ_READ_STORAGE_PERMISSION); 
} 
+0

這就是問題所在,我沒有自己讀這個圖像,但我正在使用圖像處理庫來處理傳入的照片。所以我不需要閱讀它,只是爲了檢查是否需要權限 –

+1

那麼,lib如何處理沒有權限?它向上傳播異常嗎? –

+0

它將錯誤傳播到onActivityResult,所以你是對的,我可以在那裏處理錯誤並重復整個操作。 –

0
if(PERMISSION_GRANTED != checkUriPermission(uri, android.os.Process.myPid(), android.os.Process.myUid(), 
      Intent.FLAG_GRANT_READ_URI_PERMISSION)) { 
     // request permission here 
    } 
+0

這看起來並不能處理重要的邊界情況。我只是嘗試一個URI,它指向外部存儲,但[不需要READ_EXTERNAL_STORAGE權限](https://developer.android.com/reference/android/Manifest.permission.html#READ_EXTERNAL_STORAGE),因爲它指向由'getExternalFilesDir(String)'返回的目錄下的文件。 也許這個警告的文件中解釋了原因: '對於已明確授予的權限這隻檢查 - 如果給定的進程/ UID有那麼這張支票到URI的內容提供商更廣泛的訪問將始終fail.' – Benjamin

相關問題