11

我正嘗試創建一個簡單的應用程序,可以從圖庫應用程序獲取圖像並將其顯示在imageButton上。我正在運行Android 5.0.1的手機上使用API​​ 21進行測試。不幸的是,無論我嘗試什麼,我都會收到安全錯誤 - 即使我指定了權限。Android READ_EXTERNAL_STORAGE權限不能正常工作

我爲獲得檢索圖像的代碼是:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent){ 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    switch(requestCode){ 
     case PICK_IMAGE_REQUEST: 
      if(resultCode == RESULT_OK && imageReturnedIntent != null && imageReturnedIntent.getData() != null) { 
       Uri uri = imageReturnedIntent.getData(); 
       try { 
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); 
        // Log.d(TAG, String.valueOf(bitmap)); 
        ImageButton ib = (ImageButton) findViewById(R.id.inputImg); 
        ib.setImageBitmap(bitmap); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      break; 
    } 
} 

代碼的工作,當我嘗試選擇從Dropbox的圖像,但是當我從圖庫中選擇圖片,我得到

java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/35634 from pid=25240, uid=10070 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 

我做了使用的許可標籤爲READ_EXTERNAL_STORAGE艙單的孩子:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
package="[REDACTED]"> 

    <uses-sdk 
    android:minSdkVersion="14" 
    android:targetSdkVersion="23" /> 

    <uses-permission tools:node="replace" android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18" /> 

    <application> 
     [REDACTED] 
    </application> 

</manifest> 

我已經在其他帖子上進行了高低搜索,但仍似乎無法弄清楚爲什麼我仍然得到這個令人討厭的錯誤。

+1

閱讀本文http://stackoverflow.com/questions/21196453/external-storage-permission-issue-with-mediaprovider-ring-tones或http://stackoverflow.com/questions/19837358/android-kitkat- security -ception-when-trying-to-reading-from-mediastore –

回答

13

問題
你有錯誤

java.lang.SecurityException異常:權限拒絕:閱讀com.android.providers .media.MediaProvider uri content:// media/external/images/media/35634 from pid = 25240,uid = 10070或ntUriPermission()。

原因
你沒有給予正確的權限,因爲的android:maxSdkVersion="18",它根據文檔。

此權限應授予您的應用程序的最高API級別。如果從某個API級別開始不再需要應用程序所需的權限,則設置此屬性非常有用。

只要您沒有在API 21您的應用程序授予權限的行爲確定。

檢查this topic瞭解更多信息。

SOLUTION
如果你想給讀取權限API 21,您必須聲明爲:

<uses-permission 
    android:name="android.permission.READ_EXTERNAL_STORAGE" 
    android:maxSdkVersion="21" /> 

重要:

釷只有當你需要提供額外的權限時纔有意義,因爲一些舊的api需要新版本沒有的權限,所以用戶體驗得到了改進,因爲你只在需要時請求某些權限。


所以(在這種情況下),正確的方法是:

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

加上
如果你想保存數據,你必須添加WRITE_EXTERNAL_STORAGE權限。

<uses-permission 
    android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

我發誓它昨天晚上沒有工作,當我嘗試沒有工具和maxsdk的權限,現在它在協作,就像什麼都沒有發生過。非常感謝! – Zheryu

+0

很高興幫助;) –

2

只需使用下面的一個取代和嘗試,

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+5

它不起作用 – Karoly

1

在某些設備上進行調試時,您需要明確授予權限,方法是進入設置 - >應用程序 - > MY_APPLICATION - >權限,然後授予所需權限。