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

如何将base64字符串转换为PDF并在Android应用中调用阅读器打开

Base64转PDF并打开实现方案

1. 修复PDF文件创建逻辑

原有代码使用的Environment.getExternalStorageDirectory()在Android 10及以上系统已被废弃,推荐使用应用专属外部存储目录,无需申请动态存储权限,适配性更高。优化后的转换代码如下:

private fun pdfConverter(file: DtoSymptomPdf?): File? {
    // 空参数直接返回
    if (file?.file == null || file.filename.isNullOrEmpty()) return null
    return try {
        // 获取应用专属文档目录,无需动态申请存储权限
        val pdfDir = getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)
        val pdfFile = File(pdfDir, "${file.filename}.pdf")
        // 解码Base64
        val pdfBytes = android.util.Base64.decode(file.file, 0)
        // 写入文件
        FileOutputStream(pdfFile, false).use { os ->
            os.write(pdfBytes)
            os.flush()
        }
        pdfFile
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}
  • 方法执行成功会返回生成的PDF文件对象,失败返回null,方便后续调用打开逻辑。

2. 适配Android 7.0+文件访问权限

Android 7.0及以上系统禁止直接向外部应用暴露file://类型的Uri,需要配置FileProvider实现文件共享:

  1. 在AndroidManifest.xml的<application>标签内添加如下配置:
<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>
  1. 在res/xml目录下新建file_paths.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path
        name="documents"
        path="Documents/" />
</paths>

3. 实现PDF打开逻辑

拿到生成的PDF文件对象后,调用如下方法唤起系统安装的PDF阅读器打开文件:

private fun openPdf(pdfFile: File) {
    try {
        val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            FileProvider.getUriForFile(this, "${packageName}.fileprovider", pdfFile)
        } else {
            Uri.fromFile(pdfFile)
        }
        val intent = Intent(Intent.ACTION_VIEW)
        intent.setDataAndType(uri, "application/pdf")
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        // 检测是否有可用的PDF阅读器
        if (intent.resolveActivity(packageManager) != null) {
            startActivity(intent)
        } else {
            Toast.makeText(this, "未找到可用的PDF阅读器", Toast.LENGTH_SHORT).show()
        }
    } catch (e: Exception) {
        e.printStackTrace()
        Toast.makeText(this, "打开PDF失败", Toast.LENGTH_SHORT).show()
    }
}

4. 完整调用示例

// 转换完成后直接打开
val pdfFile = pdfConverter(yourPdfDto)
pdfFile?.let { openPdf(it) }

内容的提问来源于stack exchange,提问作者Mario Muresean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:18:03