我正在尝试从设备画廊获取图像,然后在另一个活动中显示它。 我的活动中的代码:
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保存在本地数据库中,并允许其他活动和服务读取此文件。
ACTION_OPEN_DOCUMENT
,则可以尝试使用takePersistableUriPermission()
,如果成功,则可以长期访问由Uri
标识的内容。否则,您需要制作内容的本地副本。请参见此示例应用程序,以演示如何执行此操作。 - CommonsWaretakePersistableUriPermission()
可以解决这个问题。否则……说实话,我不确定。如果你曾经使用过startActivityForResult()
,你可以尝试在提供给setResult()
的Intent
上使用FLAG_GRANT_READ_URI_PERMISSION
,看看是否有效。这种情况是 Google 引导开发者减少活动数量的原因之一。 - CommonsWareACTION_SEND
和ACTION_SEND_MULTIPLE
),并且我能够保留所有这些文件的权限。不过我使用了一种捷径,我只是简单地重新利用了我接收到的意图,使用setClass(applicationContext, TargetActivity.class)
。这里是一个示例。 - squirrel