[英]Android: WRITE_EXTERNAL_STORAGE permission not accepted by device
我正在编写的Android应用程序存在一个非常奇怪的问题。
在我的应用程序中,我意图告诉手机的相机应用程序为我拍照。 拍摄完这张照片后,我想在设备的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
。
您还应该将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" />
关于您请求许可但未被用户授予许可的问题。 看看我的答案@ https://stackoverflow.com/a/35574084/529691
看看是否有帮助。
您应该提示用户向您提供权限:
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);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.