【问题标题】:Permission denial from MediaDocumentsProvider来自 MediaDocumentsProvider 的权限拒绝
【发布时间】:2015-09-09 18:04:59
【问题描述】:

我拥有以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

我在 openInputStream 行收到权限拒绝错误:

if(bgUri != null && !bgUri.isEmpty()) {
            try {
                InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(bgUri));   // <-- error
                return Drawable.createFromStream(inputStream, bgUri);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }

我首先加载我的图像

@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    if (requestCode == SELECT_PHOTO && resultCode == Activity.RESULT_OK) {
        try {
            final Uri imageUri = imageReturnedIntent.getData();

            final int takeFlags = imageReturnedIntent.getFlags()
                    & (Intent.FLAG_GRANT_READ_URI_PERMISSION
                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            // Check for the freshest data.
            mContext.getContentResolver().takePersistableUriPermission(imageUri, takeFlags);

然后保存图片uri:

            String backgroundURI = imageUri.toString();
            int backgroundID = 0;
            mStore.backgroundImageURI = backgroundURI;
            mStore.backgroundImageNumber= backgroundID;
            mStore.save();

堆栈跟踪:

﹕ FATAL EXCEPTION: main
Process: com.myapp.pocketandroid, PID: 1284
java.lang.RuntimeException: Unable to resume activity {com.myapp.pocketandroid/com.myapp.pocketandroid.MainActivity}: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{52946004 1284:com.myapp.pocketandroid/u0a60} (pid=1284, uid=10060) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2774)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2803)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2238)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{52946004 1284:com.myapp.pocketandroid/u0a60} (pid=1284, uid=10060) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
        at android.os.Parcel.readException(Parcel.java:1465)
        at android.os.Parcel.readException(Parcel.java:1419)
        at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2848)
        at android.app.ActivityThread.acquireProvider(ActivityThread.java:4399)
        at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2208)
        at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1425)
        at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1047)
        at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:904)
        at android.content.ContentResolver.openInputStream(ContentResolver.java:629)
        at com.myapp.pocketandroid.Utils.BackgroundImageManager.background(BackgroundImageManager.java:29)
        at com.myapp.pocketandroid.BaseActivity.setBackground(BaseActivity.java:83)
        at com.myapp.pocketandroid.BaseActivity.onResume(BaseActivity.java:44)

当我恢复活动并尝试加载 URI 时,为什么会出现 MediaDocumentsProvider 权限崩溃?我认为通过获得许可,我将永久保留许可。

【问题讨论】:

  • 请发布您的“尝试加载 URI”的代码以及完整的堆栈跟踪。
  • @CommonsWare 崩溃出现在第一个代码块中。我添加了一个堆栈跟踪。
  • 在调用takePersistableUriPermission()openInputStream() 之间你在做什么?您写道,当您“恢复 [您的] 活动”时,您会遇到此崩溃。您的意思是字面意思吗(即,它与您使用 takePersistableUriPermission() 的活动实例相同,并且刚刚回到前台)?还是你的意思是别的?
  • 我正在选择背景图片,保存它,它工作正常。我关闭应用程序,重新启动设备。在恢复活动时,BaseActivity 设置背景。它通过从数据库模型中查找 bgURI 来做到这一点,该模型使用 InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(bgUri)); 调用。 . >> 崩溃
  • “我正在选择背景图片”——通过ACTION_OPEN_DOCUMENT?考虑到异常细节,我会假设是这样。如果是,那么我不知道为什么这对您不起作用。好像很多人都遇到过这个问题,我还没玩过takePersistableUriPermission(),不过这显然是我需要努力的事情……

标签: android android-intent permissions


【解决方案1】:

您似乎正在使用来自here 的“获取最新数据”和来自hereSELECT_PHOTO。正确的?假设是这种情况---

SELECT_PHOTO 示例使用ACTION_PICK 选择照片。 Quoting:

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);  

但是,与pointed out 一样,Intent.ACTION_PICK 无法保证持久性。相反,请使用Intent.ACTION_OPEN_DOCUMENT。来自API docs,适用于 API 19 或更高版本:

所有选定的文档都将返回给调用应用程序,并授予持久的读写权限。如果您想在设备重启后保持对文档的访问权限,则需要使用 takePersistableUriPermission(Uri, int) 显式获取持久权限。

试试

Intent photoPickerIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);  

看看你的表现如何。

【讨论】:

  • 加载时仍然崩溃。
  • 还是同样的错误?您可以将整个内容发布在github或其他地方吗?问题可能出在此处的引号之外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2011-09-21
  • 2015-08-30
  • 2016-09-29
相关资源
最近更新 更多