java - 权限拒绝 : MediaDocumentsProvider

标签 java android android-permissions

我在尝试显示 URI 时遇到以下异常。我认为它发生在我的 Activity 停止并且我再次尝试访问可行的 URI 之后。还有其他问题可以解决这个问题,但我对如何将任何解决方案应用于我的代码感到非常困惑,因为我的 takePhotoIntent 允许拍摄照片或从图库中选择照片(见下文)。

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);
        }
    }
}

最佳答案

根据 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.

当您使用 ACTION_GET_CONTENT 时,您对 Uri 的访问在组件被销毁时结束(除非您将 Uri 传递给新组件)。如果您想在组件的生命周期之后继续访问它,则必须从 Uri 复制该文件,或者切换到 ACTION_OPEN_DOCUMENTpersist permissions (仅适用于文档 Uris)。

关于java - 权限拒绝 : MediaDocumentsProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38839879/

相关文章:

android - 在运行时询问 WebView 的摄像头权限

java - 使用 hibernate 从 URL 获取参数值而不使用请求对象?

Android - 由于位置权限从设置中撤销而导致应用程序崩溃

java - Android 13 - 访问 PDF 或其他类型文件的权限

android - 将 pptp vpn 与 android vpnservice 连接

android - 在 WebView loadUrl() 中信任证书颁发机构

android - 我在 Android 版本 4.3 中使用 ListView 添加/删除 ListView 交叉应用程序的页脚?

java - 将角度保持在 -179 到 180 度之间的简单方法

Java ServerSocket 已绑定(bind)但未监听

java - FindBugs 不关心 InputStreams