Java 权限拒绝:MediaDocumentsProvider
我在尝试显示URI时遇到以下异常。我认为它发生在我的活动停止后,我再次尝试访问一个可行的URI。还有其他问题可以解决这个问题,但我很困惑如何将任何解决方案应用到我的代码中,因为我的takePhotoIntent允许从下面的图库中拍摄或选择图片Java 权限拒绝:MediaDocumentsProvider,java,android,android-permissions,Java,Android,Android Permissions,我在尝试显示URI时遇到以下异常。我认为它发生在我的活动停止后,我再次尝试访问一个可行的URI。还有其他问题可以解决这个问题,但我很困惑如何将任何解决方案应用到我的代码中,因为我的takePhotoIntent允许从下面的图库中拍摄或选择图片 Unable to open content: content://com.android.providers.media.documents/document/image%3A49688 java.lang.SecurityException: Perm
Unable to open content: content://com.android.providers.media.documents/document/image%3A49688
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri
content://com.android.providers.media.documents/document/image%3A49688 from pid=821, uid=10238 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
我的createImageFile和我的takePhotoIntent:
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp;
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = "file:" + image.getAbsolutePath();
return image;
}
private void dispatchTakePictureIntent() {
for(int i = 0; i < 4; i++) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
outputFileUri = Uri.fromFile(photoFile);
} catch (IOException ex) {
Log.w("error","IOException");
}catch (NullPointerException nullEx) {
Log.w("error","NullPointerException");
}
// Camera.
final List<Intent> cameraIntents = new ArrayList<Intent>();
final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = getPackageManager();
final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
for (ResolveInfo res : listCam) {
final String packageName = res.activityInfo.packageName;
final Intent intent = new Intent(captureIntent);
intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
intent.setPackage(packageName);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
cameraIntents.add(intent);
}
// Filesystem.
final Intent galleryIntent = new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
// Chooser of filesystem options.
final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
// Add the camera options.
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()]));
if(id.equals(HAPPY_ID))
startActivityForResult(chooserIntent, REQUEST_HAPPY_PHOTO);
if(id.equals(SURPRISED_ID))
startActivityForResult(chooserIntent, REQUEST_SURPRISED_PHOTO);
if(id.equals(AFRAID_ID))
startActivityForResult(chooserIntent, REQUEST_AFRAID_PHOTO);
if(id.equals(UPSET_ID))
startActivityForResult(chooserIntent, REQUEST_UPSET_PHOTO);
if(id.equals(SAD_ID))
startActivityForResult(chooserIntent, REQUEST_SAD_PHOTO);
}
}
}
根据:
如果您希望应用程序仅读取/导入数据,请使用。通过这种方法,应用程序导入数据的副本,例如图像文件
如果您希望应用程序能够长期、持久地访问文档提供商拥有的文档,请使用。例如,照片编辑应用程序允许用户编辑存储在文档提供商中的图像
当您使用ACTION_GET_CONTENT时,对Uri的访问将在组件被销毁时结束,除非您将Uri传递给新组件。如果您想在组件的生命周期之后继续访问该文件,或者切换到ACTION_OPEN_文档,并且只能使用文档Uri,则必须从Uri复制该文件。根据:
如果您希望应用程序仅读取/导入数据,请使用。通过这种方法,应用程序导入数据的副本,例如图像文件
如果您希望应用程序能够长期、持久地访问文档提供商拥有的文档,请使用。例如,照片编辑应用程序允许用户编辑存储在文档提供商中的图像
当您使用ACTION_GET_CONTENT时,对Uri的访问将在组件被销毁时结束,除非您将Uri传递给新组件。如果要在组件的生命周期之后继续访问该文件,或者切换到ACTION_OPEN_文档,并且只能使用文档Uri,则必须从Uri复制该文件。另一页中提到了:我没有看到。谢谢我自己的经验表明,许可不仅与组件的使用寿命有关,而且仅限于该上下文。i、 e:您对Uri的访问仅限于接收组件,并在组件被销毁时结束,除非…。具体来说,当你开始另一项活动时,原来的活动仍然有效。另一页中提到:我没有看到。谢谢我自己的经验表明,许可不仅与组件的使用寿命有关,而且仅限于该上下文。i、 e:您对Uri的访问仅限于接收组件,并在组件被销毁时结束,除非…。具体来说,当您启动另一个活动时,原始活动仍然处于活动状态。