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_SEND
或 ACTION_SEND_MULTIPLE
收到的 Uri
不太可能是从存储访问框架获得的。
因此,您必须立即使用 Uri
。如果您不能这样做,您的选择是:
告诉用户您现在不能执行他们想要的操作,或者
现在就将数据复制到文件中(例如,在 getCacheDir()
中),然后使用并删除副本
这是我前几天提出并在帮助下解决的问题的变体。
结合使用 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_SEND
或 ACTION_SEND_MULTIPLE
收到的 Uri
不太可能是从存储访问框架获得的。
因此,您必须立即使用 Uri
。如果您不能这样做,您的选择是:
告诉用户您现在不能执行他们想要的操作,或者
现在就将数据复制到文件中(例如,在
getCacheDir()
中),然后使用并删除副本