android - 无法使用 File Provider 从内部存储打开 PDF 以在 Android 8 和 9 上查看
问题描述
仅适用于 Android 8 和 9。
我这里有一个 PDF 文件管理器 -
String url = "file:///storage/emulated/0/Android/data/com.verna.poc/files/Download/mypdf.pdf";
我正在尝试使用此文件打开此文件进行查看-
File file= new File(url);
file.setReadable(true, false);
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri pdfUri = FileProvider.getUriForFile(getApplicationContext(), BuildConfig.APPLICATION_ID + ".provider", file);
intent.setDataAndType(pdfUri, "application/pdf");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
List<ResolveInfo> resInfoList = getApplicationContext().getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
getApplicationContext().grantUriPermission(packageName, pdfUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
Intent in = Intent.createChooser(intent, "Open File");
startActivity(in);
文件选择器选项正在打开,当我使用 Google PDF 阅读器打开文件时,PDF 阅读器会立即打开和关闭。我的代码有什么问题?
解决方案
您正在尝试与另一个应用程序共享内部存储中的文件。您需要为此创建一个文件提供程序。您将需要指定一个您希望文件提供程序为其生成 Uris 的目录
FileProvider 是 ContentProvider 的一个特殊子类,它通过为文件创建 content:// Uri 而不是 file:/// Uri 来促进与应用程序关联的文件的安全共享。
FileProvider 只能为您预先指定的目录中的文件生成内容 URI。要指定目录,请使用元素的子元素在 XML 中指定其存储区域和路径。例如,以下路径元素告诉 FileProvider 您打算为私有文件区域的 images/ 子目录请求内容 URI。
这个答案有一个很好的例子
这是文档页面FileProvider
推荐阅读
- java - 根据我们是上午 9 点,如何获得今天上午 9 点或明天上午 9 点的时间戳?
- sql - 最佳 SQL 表设计
- botframework - 我们可以自定义从 Bot Framework SDK v4 (.net core) 给出的 bot 端点吗
- java - 使用 System.getProperty("Some_key") 作为键获取属性值
- java - 尝试使用 Mockito 测试电子邮件类
- php - PHP 和 OPENLDAP,无法更改密码过期错误:凭据无效
- python-3.x - 在混乱的字符串中查找子字符串
- html - 一旦我添加“透视:1px”,导航栏的位置就不再固定了。我该如何解决?
- git - Netbeans 与 Git 状态不匹配
- azure-data-factory - 如何使用 Azure 数据工厂和自托管运行时读取本地 csv 文件?