尝试打开PDF

时间:2017-12-05 11:37:47

标签: android android-intent storage-access-framework

我要求用户使用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

我做错了什么?

1 个答案:

答案 0 :(得分:0)

  

我做错了什么?

最有可能的,你的问题在于:

  

我希望用户再次访问同一文档 - 稍后,从单独的活动

请求并收到内容Uri的活动拥有该内容的权限......但您的应用没有其他内容。这包括当前流程中的其他组件,以及未来流程中的任何组件。

如果这是一个单独的活动,但仍然在同一个应用程序实例中(即,当您获得Uri时,您的进程尚未终止),则需要将该内容的权限传递给单独的活动。通过"数据"传递UriIntent setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)一样,使用ACTION_VIEW并使用Intent。请参阅this sample app,我使用FLAG_GRANT_READ_URI_PERMISSION授予Service能够阅读内容的权利。

如果您打算将Uri值本身保留(例如,将其存储为数据库中的字符串)并在将来使用它,则可以在{{1}上使用takePersistableUriPermission()请求长期访问内容。这应该会成功(我不知道您立即拒绝访问的任何情况)。您应该有权访问,直到内容发生剧烈变化,例如用户删除它。