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

安卓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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:11:01