URI未发现可持续的权限授予。

18

我正在使用意图动作ACTION_GET_CONTENT

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(i, 3);

我需要在onActivityResult中使用URI来复制用户选择的图像并压缩该复制的图像。

但是,在我使用takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION) 在onActivityResult中获取uri权限后,仍然出现了此错误。当我使用Intent操作ACTION_OPEN_DOCUMENT时,这个方法可以正常工作。

以下是堆栈跟踪:

01-08 01:22:52.581 3838-4425/com.example.wallpaper E/AndroidRuntime: FATAL EXCEPTION: 
AsyncTask Process: com.example.wallpaper, PID: 3838                                                                         
java.lang.RuntimeException: An error occured while executing doInBackground()                                                                              
at android.os.AsyncTask$3.done(AsyncTask.java:304)                                                                              
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)                                                                             
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)                                                                             
at java.util.concurrent.FutureTask.run(FutureTask.java:242)                                                                              
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)                                                                              
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)                                                                              
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)                                                                              
at java.lang.Thread.run(Thread.java:818)                                                                           
Caused by: java.lang.SecurityException: No persistable permission grants     
found for UID 10151 and Uri 0 @ content://media/external/images/media/29                                                                              
at android.os.Parcel.readException(Parcel.java:1546)                                                                              
at android.os.Parcel.readException(Parcel.java:1499)                                                                              
at android.app.ActivityManagerProxy.takePersistableUriPermission(ActivityManagerNative.java:3977)                                                                              
at android.content.ContentResolver.takePersistableUriPermission(ContentResolver.java:1658)                                                                         
at com.example.wallpaper.ImageChooser.getBitmap(ImageChooser.java:249)                                                                              
at com.example.wallpaper.ImageChooser.access$000(ImageChooser.java:110)                                                                              
at com.example.wallpaper.ImageChooser$2.doInBackground(ImageChooser.java:298)                                                                              
at com.example.wallpaper.ImageChooser$2.doInBackground(ImageChooser.java:282)                                                                              
at android.os.AsyncTask$2.call(AsyncTask.java:292)                                                                              
at java.util.concurrent.FutureTask.run(FutureTask.java:237)                                                                              
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)                                                                               
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)                                                                             
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)                                                                           
at java.lang.Thread.run(Thread.java:818

嗨,Piyush,请问有关于可持久化权限的解决方案吗?因为我正在面临同样的问题。 - Amjad Khan
嗨,我也被卡在这里已经两天了,如何请求运行时视频文件权限?如果有解决方案,请帮帮我... - Bhavesh Moradiya
是否有任何可持久的权限解决方案?因为我正在遇到同样的问题。 - Drashti
1个回答

49

但即使在onActivityResult中使用takePersistableUriPermission(uri,Intent.FLAG_GRANT_READ_URI_PERMISSION)获得uri权限后,我仍然遇到了这个错误。

takePersistableUriPermission() 是为了 ACTION_OPEN_DOCUMENT 和其他属于存储访问框架的动作而设计的,而不是针对 ACTION_GET_CONTENT


1
@BhaveshMoradiya:如果您想使用takePersistableUriPermission(),以长期访问由Uri标识的内容,则必须在响应于ACTION_OPEN_DOCUMENT时获取该UriACTION_OPEN_DOCUMENT文档中有所涵盖。如果您有其他疑虑,建议您提出一个新的Stack Overflow问题,在那里您可以详细解释您不理解的内容和需要了解的内容。 - CommonsWare
1
@androiddeveloper:“我可以访问Uri多长时间?”--最好的情况是,您将在运行进程中拥有访问权限。尽快使用内容。"...即使设备重新启动后?"--可持久化权限应该能够在设备重启后生效。 - CommonsWare
1
@androiddeveloper:嗯,从某种程度上来说,两者都是。主要是我担心我们通过FLAG_GRANT_READ_URI_PERMISSION等方式获得权限的时间长度。请参阅此博客文章了解更多信息。应用程序可以选择拒绝为该Uri提供内容,但这也会影响到ACTION_OPEN_DOCUMENT(例如,用户删除了内容,因此没有更多内容可提供)。 - CommonsWare
1
@androiddeveloper:“例如,如果我想向用户显示所有存储卷的列表,并且我是否可以访问每个存储卷,使用getPersistedUriPermissions()似乎不可能。” -- 存储卷分为您之前请求的和您没有权限的。 您知道您不能访问后者。 对于前者,您有Uri以查看是否具有权限。 StorageVolume具有UUID,因此您需要做的就是使用已请求的Uri跟踪UUID。 也许我漏掉了什么,但这似乎应该足够满足您的需求。 - CommonsWare
1
@androiddeveloper:“这只是一个列表” - 您已经跟踪了获取的Uri值。同时跟踪UUID。任何未识别的UUID都是您无法访问的卷。 “StorageVolume类实例的任何项” - 您说您正在使用StorageManager.html#getStorageVolumes(),它返回StorageVolume对象。 “StorageVolume没有Uri” - 对于您请求和获得访问权限的那些卷,它确实有Uri,因为这是您用来访问它们的方式。您已经在某个地方保存了该Uri;请将UUID与其一起保存。 - CommonsWare
显示剩余16条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接