Android内容提供商URI在重新启动后不工作

Android内容提供商URI在重新启动后不工作,android,permissions,uri,Android,Permissions,Uri,简而言之,当我从一个intent中选择一个logo图像并存储URI时,我可以显示/加载该图像。即使当我退出应用程序并再次启动它时,此功能仍然有效。 但当我重新启动平板电脑时,我遇到了权限问题 长版本: 用户可以选择一个图像 if (Build.VERSION.SDK_INT < 19){ intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT);

简而言之,当我从一个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/*");
        }
图像将加载到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" />
感谢您的帮助,谢谢


p、 首先,内容提供者的Uri不需要是持久的。它们用于即时消费,将来不一定在任意时间工作

其次,不要求您将来有权使用有效的Uri,特别是在Android 4.4上的Storage Access Framework中,您的操作\打开\文档路径。提供程序可能会为您提供更持久的权限,但您必须为此调用takePersistableUriPermission。有关详细信息,请参阅的“持久化权限”部分

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

但是我的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" />

除非通过固件的签名密钥进行签名,否则您不能持有“管理文档”权限,因为这是一种签名权限。

首先,不要求ContentProvider的Uri是持久的。它们用于即时消费,将来不一定在任意时间工作

其次,不要求您将来有权使用有效的Uri,特别是在Android 4.4上的Storage Access Framework中,您的操作\打开\文档路径。提供程序可能会为您提供更持久的权限,但您必须为此调用takePersistableUriPermission。有关详细信息,请参阅的“持久化权限”部分

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

但是我的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" />

除非由固件的签名密钥签名,否则您不能持有“管理文档”权限,因为这是一种签名权限。

存储Uri是否是一种良好的做法?如果不是,正确的耐用方式是什么?谢谢,我将参加PersistableUriPermission考试。@MichaelD:那么存储Uri是一种好的做法吗?-欢迎您存储Uri,只要您不介意数据可能丢失或您的访问权限可能丢失。如果不是,正确的耐用方式是什么我不知道什么是正确的,因为我不知道你在做什么。如果您无法处理数据丢失或不可用的情况,请将数据复制到您自己的应用程序中。即使我检查自己是否有权限,我是否可以假定Uri在重新启动或媒体扫描后将继续指向相同的数据?或者图像/视频等ID是否被重新分配,这意味着在检索存储的Uri后可能会加载错误的图像?@samgak:这对ContentProvider的作者来说是个问题。如果您指的是MediaStore,我认为这些Uri值是持久的,但我不确定。那么存储Uri是一种好的做法吗?如果不是,正确的耐用方式是什么?谢谢,我将参加PersistableUriPermission考试。@MichaelD:那么存储Uri是一种好的做法吗?-欢迎您存储Uri,只要您不介意数据可能丢失或您的访问权限可能丢失。如果不是,正确的耐用方式是什么我不知道什么是正确的,因为我不知道你在做什么。如果您无法处理数据丢失或不可用的情况,请将数据复制到您自己的应用程序中。即使我检查自己是否有权限,我是否可以假定Uri在重新启动或媒体扫描后将继续指向相同的数据?或者图像/视频等ID是否被重新分配,这意味着在检索存储的Uri后可能会加载错误的图像?@samgak:这对ContentProvider的作者来说是个问题。如果您指的是MediaStore,我认为这些Uri值是持久的,但我不确定。