2014-09-23 56 views
1

简而言之,当我从意图中选择标识图像并存储URI时,我可以显示/加载图像。即使当我退出应用程序并重新启动时,这也可以工作。 但是,当我重新启动平板我有权限问题。Android内容提供商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 

图像加载到图像查看

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.s.我在android kitkat上4.4.4

回答

5

首先,UriContentProvider不需要耐用。它们用于即时消费,未来可能不一定在任意时间工作。

其次,没有要求您将来有权使用有效的Uri,特别是Android 4.4上的存储访问框架(您的ACTION_OPEN_DOCUMENT路径)。提供商可能会为您提供更持久的权限,但您必须致电takePersistableUriPermission()。有关更多信息,请参见the Storage Access Framework documentation的“持久权限”部分。

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

但我AndroidManifest.xml中被授予这个权限

除非你是通过固件的签名密钥签署的,因为这是一个signature允许,你不能保持MANAGE_DOCUMENTS许可。

+0

然后储存Uri是否是好习惯?如果不是正确的持久方式?谢谢我将测试takePersistableUriPermission()。 – 2014-09-23 16:35:45

+1

@MichaelD:“然后储存Uri是否好习惯?” - 只要您不介意数据可能消失或您的访问可能消失,欢迎您存储'Uri'。 “如果不是正确的持久方式?” - 我不能做什么“正确”,因为我不知道你在做什么。如果您无法处理数据丢失或无法使用,请将数据复制到您自己的应用程序中。 – CommonsWare 2014-09-23 16:37:45

+0

即使我检查了我是否有权限,我是否可以假设在重新启动或媒体扫描之后,Uri将继续指向相同的数据?或者图像/视频等id被重新分配,这意味着我可能最终在检索存储的Uri后加载错误的图像? – samgak 2014-11-03 07:11:38