Permission Denial: MediaDocumentsProvider

匿名 (未验证) 提交于 2019-12-03 02:29:01

问题:

I am getting the following exception when trying to display a URI. I think it occurs after my activity is stopped and I try to access a viable URI again. There are other questions addressing this problem but I am very confused as to how to apply any solutions to my code since my takePhotoIntent allows for a picture to either be taken or chosen from gallery (found below).

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() 

My createImageFile and my 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);         }     } } 

回答1:

Per the Storage Access Framework client documentation:

  • Use ACTION_GET_CONTENT if you want your app to simply read/import data. With this approach, the app imports a copy of the data, such as an image file.

  • Use ACTION_OPEN_DOCUMENT if you want your app to have long term, persistent access to documents owned by a document provider. An example would be a photo-editing app that lets users edit images stored in a document provider.

As you are using ACTION_GET_CONTENT, your access to the Uri ends when the component is destroyed (unless you pass the Uri to a new component). You must make a copy of the file from the Uri if you'd like to continue to access it beyond the lifetime of your component or switch to ACTION_OPEN_DOCUMENT and persist permissions (possible only with document Uris).



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!