2016-03-02 104 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); 
     } 
    } 
}