重启后,Android内容提供程序URI不起作用

Mic*_* D. 1 permissions android uri

简而言之,当我从意图中选择徽标图像并存储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/*");
        }
Run Code Online (Sandbox Code Playgroud)

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

content://com.android.providers.media.documents/document/image%3A53
Run Code Online (Sandbox Code Playgroud)

图像被加载到imageView

myLogo.setImageURI(Uri.parse(f.getLogo_uri()));
Run Code Online (Sandbox Code Playgroud)

当我关闭应用程序并再次启动时,徽标已加载 - 一切正常.但是,当我重新启动平板电脑时,我收到此消息

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
Run Code Online (Sandbox Code Playgroud)

但是我的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" />
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏,谢谢!

ps我在android kitkat 4.4.4上

Com*_*are 5

首先,不要求a Uri到a ContentProvider是耐用的.它们是立即消费的,未来可能不一定在任意时间工作.

其次,您无权Uri在将来拥有使用有效的权利,尤其是Android 4.4上的存储访问框架(您的ACTION_OPEN_DOCUMENT路径).提供商可能会为您提供更持久的权限,但您必须要求takePersistableUriPermission()它.有关更多信息,请参阅Storage Access Framework文档的"持久权限"部分.

您的具体错误感觉就像上面提到的第二个问题.

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

MANAGE_DOCUMENTS除非您使用固件的签名密钥签名,否则您无法保留权限,因为这是一项signature权限.