Android10:以后无法访问可以通过Photos/Gallery选择的图像

Android 10: Unable to access later an image that can chosen through Photos/Gallery

这是我前几天提出并在帮助下解决的问题的变体。

结合使用 ACTION_OPEN_DOCUMENT 和 getContentResolver().takePersistableUriPermission,我可以稍后上传用户选择的文件。

但是,如果用户通过 Photos/Gallery 选择要通过我们的应用分享的图片,并且如果此时没有网络,则应用需要稍后尝试上传。在这次重新尝试期间,我遇到了 "Permission Denial" 异常。请让我知道可能出了什么问题。感谢您的帮助。

如何检索 URI

callingIntent = new SharedIntent();
callingIntent.action = getIntent().getAction();
callingIntent.type = getIntent().getType();
if (Intent.ACTION_SEND.equals(callingIntent.action) ||
    Intent.ACTION_SEND_MULTIPLE.equals(callingIntent.action))
{
    callingIntent.uri = (Uri) getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
    if (null == callingIntent.uri)
        callingIntent.uri = getIntent().getData();
    callingIntent.aUri = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM);
}

在通过Photos接收URI的Intent中,我们有这个-

getContentResolver().takePersistableUriPermission(callingIntent.uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

调用传递 URI 的 IntentService 进行上传 -

intentService.setData(callingIntent.uri);
intentService.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startService(intentService);

但是在调用startService的时候,出现了"Permission denial"异常——"Permission denial: no permissions found for UID...."

您无法可靠地获得对任意 Uri 值的持久 Uri 权限。这仅在您从存储访问框架获得 Uri 时有效,例如您的 ACTION_OPEN_DOCUMENT 场景。您从 ACTION_SENDACTION_SEND_MULTIPLE 收到的 Uri 不太可能是从存储访问框架获得的。

因此,您必须立即使用 Uri。如果您不能这样做,您的选择是:

  1. 告诉用户您现在不能执行他们想要的操作,或者

  2. 现在就将数据复制到文件中(例如,在 getCacheDir() 中),然后使用并删除副本