我要求用户使用ACTION_OPEN_DOCUMENT选择PDF文档。意图返回内容URI。
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("application/pdf");
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.addCategory(Intent.CATEGORY_OPENABLE);
内容URI的格式为 - 内容://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FSample%20PDF.pdf
现在,我希望用户再次访问同一文档 - 稍后再从单独的活动中访问。所以我写下面的代码 -
Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
pdfIntent.setData(document.getLocalUri());
pdfIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
mContext.startActivity(pdfIntent);
但是我收到以下错误 -
java.lang.SecurityException: UID 10197 does not have permission to content://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FSample%20PDF.pdf [user 0]; you could obtain access using ACTION_OPEN_DOCUMENT or related APIs
我做错了什么?
答案 0 :(得分:0)
我做错了什么?
最有可能的,你的问题在于:
我希望用户再次访问同一文档 - 稍后,从单独的活动
请求并收到内容Uri
的活动拥有该内容的权限......但您的应用没有其他内容。这包括当前流程中的其他组件,以及未来流程中的任何组件。
如果这是一个单独的活动,但仍然在同一个应用程序实例中(即,当您获得Uri
时,您的进程尚未终止),则需要将该内容的权限传递给单独的活动。通过"数据"传递Uri
与Intent
setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
一样,使用ACTION_VIEW
并使用Intent
。请参阅this sample app,我使用FLAG_GRANT_READ_URI_PERMISSION
授予Service
能够阅读内容的权利。
如果您打算将Uri
值本身保留(例如,将其存储为数据库中的字符串)并在将来使用它,则可以在{{1}上使用takePersistableUriPermission()
请求长期访问内容。这应该会成功(我不知道您立即拒绝访问的任何情况)。您应该有权访问,直到内容发生剧烈变化,例如用户删除它。