android - 无法使用文件提供程序从内部存储打开 PDF 以便在 Android 8 和 9 上查看

标签 android pdf android-9.0-pie android-8.1-oreo

仅适用于 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 阅读器会立即打开和关闭。我的代码有什么问题吗?

最佳答案

从拥有该私有(private)目录的应用程序内访问文件 - Intent 不会删除它,因为这可能是由任何应用程序发送的。如果它必须是文件选择器 Intent,则在 SD 卡上为您的应用程序创建一个共享目录,任何应用程序都可以访问它;常规的 Downloads 目录也适合于此。 另一种选择(如最初建议的那样)是创建一个简单的文件选择器,它驻留在应用程序中,这样就不需要 Intent 来选择文件......这一切都有一定的进步和预付款;选择最适合您的一种可能性...一般来说,它是私有(private)存储位置与共享存储位置。

关于android - 无法使用文件提供程序从内部存储打开 PDF 以便在 Android 8 和 9 上查看,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54948250/

相关文章:

java - 如何在滑动菜单中将标题添加到 ListView ?

android - 我的 Android 相机 Uri 返回一个空值,但三星修复程序已经到位,帮助?

android - Android P 中弃用的 DialogFragment 类

android - Android Unity 插件中的 onPause/onResume

java - 我的 Int() 总是返回 0?

php - 图像隐藏在 mpdf8 中的内容后面

pdf - 从一个 .ps 文件创建两个 pdf?

android - 如何在 Android 的 WebView 中打开本地 PDF 文件?

java - Android SDK 28 - PackageInfo 中的 versionCode 已被弃用

Android P Beta - AlarmManager 通知不工作