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
相关产品推荐
相关产品推荐

