异常java.lang.SecurityException:读取..MediaDocumentsProvider ...需要android.permission.MANAGE_DOCUMENTS或grantUriPermission()

jaz*_*bpn 4 android file-permissions android-manifest android-permissions document-provider

在尝试为个人资料图片选择图片时,我仅在某些设备中发现了此问题。在模拟器中签入时,这些问题没有出现,但在应用程序的实时版本中,此用户面临此问题。从Firebase崩溃报告中捕获的屏幕截图。请帮助我找出问题所在。

AndroidMenifest.xml

...
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
...
Run Code Online (Sandbox Code Playgroud)

SomeActivity.java

private void pickProfilePictureTask() {

    Intent intent = null;
    if (Build.VERSION.SDK_INT > 19) {

        intent = new Intent(Intent.ACTION_OPEN_DOCUMENT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.addCategory(Intent.CATEGORY_OPENABLE);

    } else {

        intent = new Intent(Intent.ACTION_GET_CONTENT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    }

    intent.setType("image/*");
    startActivityForResult(intent, IMAGE_PICKER_REQUEST);


}


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == IMAGE_PICKER_REQUEST && resultCode == Activity.RESULT_OK) {


        if (data != null) {
            /**Getting bitmap
             *
             * InputStream inputStream = getActivity().getContentResolver().openInputStream(data.getData());
             * Bitmap userPicBitmap = BitmapFactory.decodeStream(inputStream);
             */
            File file = new File(getFileNameFromURI(data.getData()));
            String imageName = file.getPath();
            uploadProfilePicture.setText(imageName);
            userProfilePicUri = data.getData() + "";

        }


    }
}

private String getFileNameFromURI(Uri contentURI) {
    String result;
    Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
    if (cursor == null) {
        result = contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME);
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

Android 5.1.1中的错误 Exception java.lang.SecurityException:权限被拒绝:从pid = 19207 读取com.android.providers.media.MediaDocumentsProvider uri content://com.android.providers.media.documents/document/image%3A6617 ,uid = 10260需要android.permission.MANAGE_DOCUMENTS或grantUriPermission()

在此处输入图片说明

Android 8.0.0中的错误 Exception java.lang.SecurityException:权限被拒绝:从ProcessRecord {5c1039e 5061:com.mobotechnology.cvmaker / u0a219}(pid = 5061,uid = 10219)打开提供程序com.android.providers.media.MediaDocumentsProvider要求您使用ACTION_OPEN_DOCUMENT或相关API获得访问权限

在此处输入图片说明

Com*_*are 5

我正在尝试保留Uri,以后再使用该Uri

这将适用于Uri一个file方案。它不适用于Uri使用content方案的大多数值。这些更类似于经过身份验证的网站的HTTP URL —在会话处于活动状态时该URL很好,但是此后却毫无用处。

如果你获得Uri通过ACTION_OPEN_DOCUMENTACTION_CREATE_DOCUMENT或者ACTION_OPEN_DOCUMENT_TREE你打电话takePersistableUriPermission()ContentResolver供应Uri那么你可以放心地坚持说Uri。您将无限期地访问内容,直到用户撤消访问或内容发生重大变化(例如,被删除),使其Uri不再有效为止。

任何其他content Uri(例如ACTION_GET_CONTENT)都只在很短的时间内才有。您在这里唯一的选择是将内容复制到您控制的某个文件(例如中的getCacheDir()),然后将路径保存到该文件。