许可拒绝媒体文件提供者

IrA*_*App 1 android image path gallery

我想从图库中选择一张图片,然后保存路径。我使用此路径在RecyclerView. 我Picasso用来下载图像ImageView. 我遇到的问题如下:

当我选择图像正确显示在 RecyclerView,但如果我离开屏幕并返回,我会收到此错误:

01-19 15:05:18.984 542-840/? W/ActivityManager:权限拒绝:从...打开提供程序 com.android.providers.media.MediaDocumentsProvider 需要 android.permission.MANAGE_DOCUMENTS 或 android.permission.MANAGE_DOCUMENTS

并且图像不再显示。这是我的代码:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<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"/>


 AlertDialog.Builder builder = new AlertDialog.Builder(getMainActivity());
    builder.setTitle("Choose Image Source");
    builder.setItems(new CharSequence[] {"Gallery"},
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    switch (which) {
                            Intent intent;
                            // GET IMAGE FROM THE GALLERY
                            intent = new Intent(Intent.ACTION_GET_CONTENT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                            intent.setType("image/*");
                            intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);   // Show local files only (available since honeycomb, sdkVersion 11)

                            startActivityForResult(Intent.createChooser(intent, "Choose a picture"), Constants.REQUEST_CHOOSE_PHOTO);
                }
            });

    builder.show();


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    ImageDb image = new ImageDb();
    if (resultCode == Activity.RESULT_OK) {
        switch (requestCode) {  
            case Constants.REQUEST_CHOOSE_PHOTO:
                image.setImageFilePath(data.getData().toString());

                break;
        }
        images.add(image);
    }
}


 @BindingAdapter({"url", "size"})
public static void loadImage(ImageView imageView, String url, float size) {
    if (!Strings.isNullOrEmpty(url)) {
        Picasso.with(imageView.getContext()).load(url).resize((int) size, (int) size).centerCrop().into(imageView);
    }
}
Run Code Online (Sandbox Code Playgroud)

有人知道问题出在哪里吗?提前致谢!

Com*_*are 9

我想从图库中选择一张图片然后保存路径

那是行不通的。当您使用时ACTION_GET_CONTENT您拥有使用您取回的临时权利Uri

还要注意的是ACTION_GET_CONTENT并不需要UriIntent。摆脱android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI.

有人知道问题出在哪里吗?

您正在尝试使用Uri稍后返回的 。接收到 的实例组件(在本例中为活动)Uri有权使用它,但您的应用程序中没有其他任何内容。

在某些情况下,您可以将访问权限传播到其他组件实例。例如,假设 Activity A 具有您问题中的代码,并且您在其中调用startActivity()以启动 Activity B。Uri默认情况下,Activity B 将无法访问由 标识的内容。但是,活动 A 可以将FLAG_GRANT_READ_URI_PERMISSION标志添加到Intent它使用的 with startActivity(),并将读取访问权限传递给活动 B。

但是,其他形式的导航(例如,后退按钮)不提供此功能,更不用说将 保持Uri为字符串并尝试在明天或下周使用它。

如果您切换到ACTION_OPEN_DOCUMENTAndroid 4.4+,您可以尝试使用takePersistableUriPermission()on ContentResolver,在这种情况下,您可以获得对该内容的持久访问。

否则,如果您正在寻找对内容的长期访问,则需要将内容(例如,复制图像)复制到您控制的存储(例如,内部存储)中。