安卓Kotlin应用生成PDF后如何调用系统默认查看器打开?
解决安卓Kotlin应用生成PDF后调用系统默认查看器打开的问题
你的代码已经完成了PDF的保存操作,只需完善previewPDF方法并适配Android高版本的Uri访问规则,就能实现生成PDF后自动打开的功能。以下是完整修改方案:
1. 实现previewPDF方法
在你的类中添加该方法,用于启动系统PDF查看器:
private fun previewPDF(pdfUri: Uri) { val viewIntent = Intent(Intent.ACTION_VIEW).apply { setDataAndType(pdfUri, "application/pdf") flags = Intent.FLAG_ACTIVITY_NO_HISTORY or Intent.FLAG_GRANT_READ_URI_PERMISSION } context?.let { ctx -> if (viewIntent.resolveActivity(ctx.packageManager) != null) { startActivity(viewIntent) } else { Toast.makeText(ctx, "未找到可用的PDF查看器", Toast.LENGTH_SHORT).show() } } }
2. 适配Android 7.0+的Uri访问规则
Android 7.0(API 24)及以上禁止直接使用file://格式的Uri暴露文件,必须通过FileProvider生成content://格式的Uri。
步骤2.1 配置AndroidManifest.xml
在<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>
步骤2.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="downloads" path="Download" /> </paths>
步骤2.3 修改savePDF方法的Uri生成逻辑
将原代码中的previewPDF(Uri.fromFile(file))替换为以下代码,根据系统版本生成适配的Uri:
val pdfUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { FileProvider.getUriForFile(context!!, "${context.packageName}.fileprovider", file) } else { Uri.fromFile(file) } previewPDF(pdfUri)
3. 权限适配(可选)
- Android 10(API 29)及以上:访问公共下载目录无需额外权限。
- Android 6.0-9(API 23-28):需申请存储权限,操作如下:
3.1 添加权限声明到AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
3.2 动态申请权限
在调用savePDF()前检查并申请权限:
private const val REQUEST_CODE_STORAGE = 100 // 调用savePDF前的权限检查 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context?.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions(arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_CODE_STORAGE) } else { savePDF() } // 权限回调处理 override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == REQUEST_CODE_STORAGE && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { savePDF() } else { Toast.makeText(context, "需要存储权限才能生成并查看PDF", Toast.LENGTH_SHORT).show() } }
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

