【问题标题】:Grant Uri permission to another activity授予 Uri 对另一个活动的权限
【发布时间】:2016-10-06 14:20:33
【问题描述】:

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

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 时,我得到 SecurityExceptionDocs 表示对接收到的 uri 的许可将持续到接收它们的活动完成为止。因此,当我的活动完成后,我没有读取文件的权限。

有没有办法延长 uri 权限以允许其他活动通过此 uri 打开文件?还是唯一的方法是将图像复制到本地应用存储?

UPD:我的目标是将收到的 uri 保存在本地数据库中,并允许其他活动和服务读取此文件。

【问题讨论】:

    标签: android android-permissions


    【解决方案1】:

    有没有办法延长 uri 权限以允许其他活动通过此 uri 打开文件?

    是的。 Include FLAG_GRANT_READ_URI_PERMISSION when you pass the Uri从第一个活动到第二个活动:

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

    【讨论】:

    • 对不起。我的问题不够清楚。我的目标是将收到的 uri 保存在本地数据库中,并允许其他活动和服务读取此文件。更新答案
    • @nnesterov:“我的目标是将收到的 uri 保存在本地数据库中”——这行不通。如果您在Android 4.4+ 上使用ACTION_OPEN_DOCUMENT,您可以尝试使用takePersistableUriPermission(),如果可行,您可以长期访问Uri 标识的内容。否则,您需要制作内容的本地副本。请参阅 this sample app 以获取执行此操作的演示。
    • @CommonsWare 如果我需要将 uri 权限延长到 backstack 中的先前活动?
    • @Xan: takePersistableUriPermission() 将涵盖这一点。否则……说实话,我不确定。如果您碰巧使用过startActivityForResult(),您可以在提供给setResult()Intent 上尝试FLAG_GRANT_READ_URI_PERMISSION,看看是否有效。这种情况是 Google 引导开发人员减少活动的原因之一。
    • @CommonsWare FLAG_GRANT_READ_URI_PERMISSION 在 setResult Intent 中失败。尝试使用 takePersistableUriPermission
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2013-07-18
    • 2017-07-06
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多