You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 7.1(Nougat)系统无法启动PDF查看器问题求助

解决Android 7.1+无法展示PDF的问题

这个问题的核心原因是Android 7.0(API Level 24)开始引入的StrictMode API政策限制——系统禁止应用向其他应用传递file://格式的Uri,否则会抛出FileUriExposedException,这就是你的代码在Android 6.1正常、7.1失效的关键。

下面是完整的修复方案:

步骤1:在AndroidManifest.xml中注册FileProvider

在<application>标签内添加FileProvider的注册信息:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

如果你用的是旧的support库,把androidx.core.content.FileProvider换成android.support.v4.content.FileProvider即可。

步骤2:创建文件路径配置文件

在res/xml目录下新建file_paths.xml文件(如果没有xml目录就新建一个),内容如下:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="." />
</paths>

这个文件用来告诉FileProvider哪些目录下的文件可以被共享,external-path对应外部存储根目录,path="."表示整个外部存储都允许访问。

步骤3:修改showPDF方法的代码

替换原来的Uri生成方式,改用FileProvider生成content://格式的Uri,并给Intent添加临时权限:

public void showPDF() {
    File pdfFile = new File(Environment.getExternalStorageDirectory(), "A_DailyRegiser.pdf");
    try {
        if (pdfFile.exists()) {
            // 生成content://格式的安全Uri
            Uri path = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", pdfFile);
            Intent objIntent = new Intent(Intent.ACTION_VIEW);
            objIntent.setDataAndType(path, "application/pdf");
            // 给目标应用临时读取权限,必须添加
            objIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            // 先检查是否有能处理该Intent的应用,避免崩溃
            if (objIntent.resolveActivity(getPackageManager()) != null) {
                startActivity(objIntent);
            } else {
                Toast.makeText(this, "没有找到可以打开PDF的应用", Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(this, "PDF文件不存在", Toast.LENGTH_SHORT).show();
        }
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this, "打开PDF失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

关键说明:

  • FileProvider.getUriForFile生成的content://Uri符合Android 7.0+的安全规范,不会触发StrictMode的限制
  • Intent.FLAG_GRANT_READ_URI_PERMISSION是必须的,否则目标PDF阅读器没有权限读取你的应用共享的文件
  • 增加resolveActivity检查可以避免因设备上没有PDF阅读器而导致的崩溃

内容的提问来源于stack exchange,提问作者santosh kumar sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:52:07