如何将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实现文件共享:
- 在
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>
- 在
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
相关产品推荐
相关产品推荐

