无法通过传递其 Uri/UID 来访问文件?



不能通过传递uri/UID访问文件,10153没有访问权限

我有一个邮箱类型的应用程序,其附件附加到消息中。当您下载附件时,您可以通过传递uri的intent打开该附件。uri看起来像这样:"content://com.android.providers.downloads.documents/document/13".

我通过将包含路径和附件ID的对象转换为GSON的JSON并将其存储为字符串,将下载的附件保存为共享首选项,因此我可以在再次访问应用程序时获取列表,因此我不会丢失指向文件的链接,因此用户需要始终再次下载它们。

我比较了id并将onClickListener分配给已经保存的附件。在这个onClickListener上,我放了一个打开文件的意图,只有当我不重新启动我的应用程序时才有效。

attachmentFileName?.setOnClickListener {
Log.i("URI", attachmentDownloaded.path)
val intent = Intent(Intent.ACTION_VIEW)
intent.setDataAndType(attachmentDownloaded.path.toUri(), attachment.mimeType)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
startActivity(activity, intent, null)
}

但是如果我在重新启动应用程序后尝试打开附件文件,它会抛出SecurityException

java.lang.SecurityException: UID 10153 does not have permission to content://com.android.providers.downloads.documents/document/13 [user 0]; you could obtain access using ACTION_OPEN_DOCUMENT or related APIs

如果我尝试像错误所说的那样使用ACTION_OPEN_DOCUMENT,我会得到相同的异常。

有人知道为什么会这样吗?

可能是因为你使用的是android 10或android 11。你不能像那样在android 11中访问URI。如果您已经从系统图库中选择了任何图像,那么就可以了。但是如果你将URI路径保存为字符串,然后在重新启动应用程序后访问它,那么你就不能在android 11中这样做。

我以前也遇到过这个问题。有一个简单的解决办法。如果你想在应用程序中访问该文件以供以后使用,该条目将其从原始位置复制到应用程序的缓存或文件目录。

你会发现上面有很多文件。当您第一次获得文件的URI时,只需将文件保存到files目录中。

所以,当你第二次打开你的应用程序时,你不会使用那个文件的原始URI,而是从你的应用程序的内部应用程序目录或缓存目录中保存的路径,无论你保存它在哪里。

最新更新