2016-03-02 22 views
0

我正在寫一個Android應用程序時出現一個相當奇怪的問題。Android:WRITE_EXTERNAL_STORAGE權限未被設備接受

在我的應用程序中,我使用意圖告訴手機的相機應用程序爲我拍照。拍完這張照片後,我想將新拍攝的照片註冊到設備的MediaStore內容提供商,以便在常規「圖庫」應用中顯示。

要做到這一點,我知道我需要WRITE_EXTERNAL_STORAGE權限,但即使它在我的清單中,我也會得到權限被拒絕的異常。我必須做些什麼才能獲得此許可?我正在運行Android 6.0.1。

這裏是我的權限XML在清單:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" 
    android:maxSdkVersion="18" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

下面是導致異常的代碼:

 // insert photo into phone's main photo content provider 
     ContentResolver cr = getActivity().getContentResolver(); 

     try { 
      MediaStore.Images.Media.insertImage(cr, photoFile.getPath(), 
        "Image Capture", "Custom Image capture"); 
     } catch (FileNotFoundException foe) { 
      Log.e(DEBUG, foe.getMessage()); 
     } 

而這裏的例外,我得到:

java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=2436, uid=10041 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission() 

編輯:我應該提一下:

現在我的應用程序使用getExternalFilesDir(Environment.DIRECTORY_PICTURES),它返回路徑/sdcard/Android/data/<package>/files/Pictures來保存它的照片。我希望他們去攝像機應用程序通常放置在/sdcard/DCIM/Camera

+0

是一本運行android棉花糖? – JoxTraex

+0

您不需要存儲權限 - 您可以將該文件寫入由[getExternalMediaDirs()](http://developer.android.com/reference/android/content/Context.html#getExternalMediaDirs())返回的目錄中在棒棒糖+設備上。 – ianhanniballake

+0

是的,我在Mashmallow 6.0.1上運行。 – RGrun

回答

0

您應該將android:maxSdkVersion="18"也添加到WRITE_EXTERNAL_STORAGE中。您的代碼應如下所示:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" 
android:maxSdkVersion="18" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
android:maxSdkVersion="18" /> 
0

你應該PROMT用戶提供您的權限:

int externalPermissionCheck = ContextCompat.checkSelfPermission(this, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    if (externalPermissionCheck==-1){ 
     askPermissionStorage(); 
    } 


private void askPermissionStorage() { 
    //for media 
    if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission. 
      WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 

     //insert explanation 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
      //if you want to explaian to the user 

     } else {//if no explanation needed 
      ActivityCompat.requestPermissions(this, new 
          String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); 
     } 
    } 
} 

以上是保存圖片\視頻 ,這是相機的權限:

int cameraPermissionCheck = ContextCompat.checkSelfPermission(this, 
      Manifest.permission.CAMERA); 
    if (cameraPermissionCheck == -1) { 
     askPermissionCamera(); 
    } 
private void askPermissionCamera() { 
    //for camera 
    if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission. 
      CAMERA) != PackageManager.PERMISSION_GRANTED) { 
     //insert explanation 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.CAMERA)) { 
      //if you want to explaian to the user 

     } else {//if no explanation needed 
      ActivityCompat.requestPermissions(this, new 
          String[]{Manifest.permission.CAMERA}, 
        MY_PERMISSIONS_REQUEST_CAMERA); 
     } 
    } 
} 
相關問題