授予另一个活动Uri权限

8

我正在尝试从设备画廊获取图像,然后在另一个活动中显示它。 我的活动中的代码:

private void startGallery() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("image/*");
    startActivityForResult(intent, REQ_OPEN_GALLERY)
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQ_OPEN_GALLERY &&  resultCode == Activity.RESULT_OK) {
        Uri imageUri = data.getData()
        // here I save image uri to pass to another activity
    }
}

当我尝试在另一个活动中打开URI时,我遇到了“SecurityException”错误。文档指出,接收到的URI的权限持续到接收它们的活动结束为止。因此,当我的活动结束时,我没有权限读取文件。
有没有办法延长URI权限,以允许其他活动通过此URI打开文件?还是唯一的方法是将图像复制到本地应用程序存储?
更新:我的目标是将接收到的URI保存在本地数据库中,并允许其他活动和服务读取此文件。
1个回答

13

有没有一种方法可以延长URI权限,以允许其他活动通过此URI打开文件?

是的。在从第一个活动传递Uri到第二个活动时,请包含FLAG_GRANT_READ_URI_PERMISSION(参考链接)

startActivity(new Intent(this, Something.class).setData(uri).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION));

1
抱歉,我的问题没有表述清楚。我的目标是将收到的 URI 保存在本地数据库中,并允许其他活动和服务读取此文件。更新答案。 - nnesterov
2
@nnesterov:“我的目标是将接收到的URI保存在本地数据库中” - 这样做不会起作用。如果您在Android 4.4+上使用ACTION_OPEN_DOCUMENT,则可以尝试使用takePersistableUriPermission(),如果成功,则可以长期访问由Uri标识的内容。否则,您需要制作内容的本地副本。请参见此示例应用程序,以演示如何执行此操作。 - CommonsWare
@CommonsWare,如果我需要将URI权限延长到后退堆栈中的上一个活动,该怎么办? - Alessandro Scarozza
@Xan:takePersistableUriPermission() 可以解决这个问题。否则……说实话,我不确定。如果你曾经使用过 startActivityForResult(),你可以尝试在提供给 setResult()Intent 上使用 FLAG_GRANT_READ_URI_PERMISSION,看看是否有效。这种情况是 Google 引导开发者减少活动数量的原因之一。 - CommonsWare
@CommonsWare FLAG_GRANT_READ_URI_PERMISSION 在 setResult Intent 中失效。尝试使用 takePersistableUriPermission。 - Alessandro Scarozza
谢谢,这种方法可行!我正在接收一个或多个文件(ACTION_SENDACTION_SEND_MULTIPLE),并且我能够保留所有这些文件的权限。不过我使用了一种捷径,我只是简单地重新利用了我接收到的意图,使用setClass(applicationContext, TargetActivity.class)。这里是一个示例 - squirrel

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