如何在Uri图像上授予永久权限(androidx)

3
在我的应用程序中,用户可以通过使用androidX方法打开画廊并选择他们的图片。
registeredIntent = registerForActivityResult(new ActivityResultContracts.GetMultipleContents(), this);

而结果的回调是在这个方法中发送的:

@Override
public void onActivityResult(List<Uri> result) {
    if(result != null && result.size() > 0) {
        sliderImageAdapter.addItems(result);
        binding.includeResultTask.imageSlider.setSliderAdapter(sliderImageAdapter, true);
    }
}

到目前为止,这个功能运行得非常完好。通过在适配器中添加Uri,我的相册组件可以显示图像。问题是我将它们保存在数据库中,当我重启应用程序时,权限被吊销,导致应用程序崩溃。我尝试为每个项在回调函数中添加以下内容:
requireActivity().getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

但是我遇到了这个错误:
Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{41a7dce 26094:it.ilogreco.levelup/u0a482} (pid=26094, uid=10482) requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs

我甚至尝试使用以下方式对每个项目进行操作:

context.grantUriPermission(context.getPackageName(), uri, FLAG_GRANT_READ_URI_PERMISSION);

但是我遇到了这个错误:
UID 10482 does not have permission to content://com.android.providers.media.documents/document/image%3A108953 [user 0]; you could obtain access using ACTION_OPEN_DOCUMENT or related APIs

我使用registerForActivityResult一次性加载Uris并将它们保存到数据库中,但是我无法再次使用API打开媒体库,因为这没有意义,你有什么办法可以获得这些权限吗?我想避免在回调中复制内容。

1个回答

4

ActivityResultContracts.GetMultipleContents切换到ActivityResultContracts.OpenMultipleDocuments。然后,您的takePersistableUriPermission()调用应该能够工作。只有通过存储访问框架获得的文档才能获取可持续的Uri权限,这正是OpenMultipleDocuments使用的。


哦天啊,你不知道我在这个问题上浪费了多少时间,而我距离解决方案只有两个单词之遥,非常感谢你:D - Ivan Lo Greco

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