首页 > 解决方案 > 无法使用 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 阅读器会立即打开和关闭。我的代码有什么问题?

标签: androidpdfandroid-9.0-pieandroid-8.1-oreo

解决方案


您正在尝试与另一个应用程序共享内部存储中的文件。您需要为此创建一个文件提供程序。您将需要指定一个您希望文件提供程序为其生成 Uris 的目录

FileProvider 是 ContentProvider 的一个特殊子类,它通过为文件创建 content:// Uri 而不是 file:/// Uri 来促进与应用程序关联的文件的安全共享。

FileProvider 只能为您预先指定的目录中的文件生成内容 URI。要指定目录,请使用元素的子元素在 XML 中指定其存储区域和路径。例如,以下路径元素告诉 FileProvider 您打算为私有文件区域的 images/ 子目录请求内容 URI。

这个答案有一个很好的例子

关联

这是文档页面FileProvider

文件提供者


推荐阅读