安全异常:ACTION_IMAGE_CAPTURE中没有持久化的权限授予URI。

5

我的应用程序使用相机拍照并长期使用。

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri resultUri = null;
resultUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
      new ContentValues());
imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, resultUri);
startActivityForResult(imageCaptureIntent, IMAGE_CAPTURE_REQUEST_CODE);

但是当我调用takePersistableUriPermission()时,我会收到SecurityException: No persistable permission grants found的错误。
我已经阅读了这篇文章Getting Permission Denial Exception。它对于ACTION_OPEN_DOCUMENT完美地运作。如何从相机获取持久权限呢?

1
你已经有了URI - 为什么还需要持久化访问? - ianhanniballake
@ianhanniballake 哇,你说得对。重启后,可以在没有持久权限的情况下访问来自相机的URI。但是,如果我不调用takePersistableUriPermission(),为什么从ACTION_GET_CONTENT获取URI会失败呢? - Mingwei Lin
1个回答

9
< p > 访问 < code > MediaStore URI 仅受存储权限(即 READ_EXTERNAL_STORAGE)控制,因此只要您继续持有存储权限,就可以访问 URI,因此在这种情况下根本不需要持久化权限。 < / p > < p > 基于 URI 的权限(URI based permissions)用于 < code > ACTION_GET_CONTENT ,< code > ACTION_OPEN_DOCUMENT 等,通过返回的 < code > Intent 中包含 FLAG_GRANT_READ_URI_PERMISSION 特殊一次访问 URI。 < / p > 只有文档URI(其中DocumentsContract.isDocumentUri()返回true的URI)才允许您持久化权限以便更长期地访问URI。

谢谢解释。那帮了很多。 - Mingwei Lin
1
不完全正确。如果您要求用户使用Intent.ACTION_GET_CONTENT选择文件,则接收到的URI将成功通过DocumentsContract.isDocumentUri(),但如果尝试调用takePersistableUriPermission()保存权限,则会失败,并出现异常SecurityException:No persistable permission grants found for //UID 10829 and Uri content://...;您应该使用Intent.ACTION_OPEN_DOCUMENT打开文件选择器。 - Kirill Karmazin

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