【问题标题】:Android content provider URI doesn't work after reboot重启后 Android 内容提供程序 URI 不起作用
【发布时间】:2014-09-23 16:13:10
【问题描述】:

简而言之,当我从意图中选择徽标图像并存储 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()));

当我关闭应用程序并重新启动时,会加载徽标 - 一切正常。 但是当我重新启动平板电脑时,我收到了这条消息

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

【问题讨论】:

    标签: android permissions uri


    【解决方案1】:

    首先,UriContentProvider 不需要持久。它们用于即时消费,不一定在未来的任意时间起作用。

    其次,您无需拥有在未来使用有效Uri 的权利,尤其是对于 Android 4.4 上的存储访问框架(您的 ACTION_OPEN_DOCUMENT 路径)。提供商可能会为您提供更持久的权限,但您必须为此致电 takePersistableUriPermission()。有关更多信息,请参阅the Storage Access Framework documentation 的“持久权限”部分。

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

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

    您不能拥有MANAGE_DOCUMENTS 权限,除非您由固件的签名密钥签名,因为这是signature 权限。

    【讨论】:

    • 那么存储 Uri 是个好习惯吗?如果不是,那么正确的持久方式是什么?谢谢,我会测试 takePersistableUriPermission()。
    • @MichaelD.:“那么存储 Uri 是个好习惯吗?” -- 欢迎您存储Uri,只要您不介意数据可能已丢失或您的访问权限可能已丢失。 “如果不是,正确的持久方法是什么?” - 我不知道什么是“正确的”,因为我不知道你在做什么。如果您无法处理丢失或不可用的数据,请将数据复制到您自己的应用中。
    • 即使我检查我是否有权限,我是否可以假设 Uri 在重新启动或媒体扫描后将继续指向相同的数据?或者图像/视频等 id 是否被重新分配,这意味着我可能在检索存储的 Uri 后最终加载错误的图像?
    • @samgak:这将是ContentProvider 的作者的问题。如果您指的是MediaStore,我认为那些Uri 值是持久的,但我不确定。
    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    相关资源
    最近更新 更多