重启后 Android 内容提供商 URI 不起作用

标签 android permissions uri

简而言之,当我从 Intent 中选择 Logo 图像并存储 URI 时,我可以显示/加载该图像。即使我退出应用程序并重新启动它,它也能正常工作。 但是当我重新启动平板电脑时,我遇到了权限问题。

长版:

用户可以选择一张图片

        if (Build.VERSION.SDK_INT < 19){
            intent = new Intent();
            intent.setAction(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
        } else {
            intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            intent.setType("image/*");
        }

然后,我将内容提供商 URI 存储到我的应用程序的数据库中,如下所示:

content://com.android.providers.media.documents/document/image%3A53

图像被加载到 imageView

myLogo.setImageURI(Uri.parse(f.getLogo_uri()));

当我关闭应用程序并再次启动时, Logo 已加载 - 一切正常。 但是当我重启平板电脑时,我收到这条消息

ImageView﹕ Unable to open content: content://com.android.providers.media.documents/document/image%3A53
java.lang.SecurityException: Permission Denial: opening provider 
com.android.providers.media.MediaDocumentsProvider from ProcessRecord
{x y:clazz.stuff} (pid=blah, uid=blah) requires android.permission.MANAGE_DOCUMENTS 
or android.permission.MANAGE_DOCUMENTS

但我的 AndroidManifest.xml 正在授予该权限

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

感谢任何帮助,谢谢!

附注我在 android kitkat 4.4.4

最佳答案

首先,ContentProviderUri 不需要持久。它们供立即使用,不一定在未来的任意时间起作用。

其次, future 您无需有权使用有效的Uri,尤其是在 Android 4.4 上的存储访问框架(您的ACTION_OPEN_DOCUMENT小路)。提供商可能会为您提供更持久的权限,但您必须为此调用 takePersistableUriPermission()。请参阅 the Storage Access Framework documentation 的“持久权限”部分了解更多。

您的具体错误感觉就像上面概述的第二个问题。

but my AndroidManifest.xml is granting that permission

您不能拥有MANAGE_DOCUMENTS 权限,除非您使用固件的签名 key 进行签名,因为这是一个签名 权限。

关于重启后 Android 内容提供商 URI 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25999886/

相关文章:

java - 错误 :Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference

安卓蓝牙配对输入设备

rest - 通过 restful api 访问文件的权限被拒绝

http - 我应该在 URI 的查询字符串中对参数名称进行编码吗?

android - 如何在android中创建 "general"共享 Intent ?

android - 向 MuPDF android 添加注释

azure - 为什么我的 JWT token 范围缺少 Azure 权限?

java - MACOS 上的 HAVE 权限错误

java - 存储访问框架 - 保存 Uri

http - 何时从 http 请求规范中使用 absoluteUri?