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

开发含可下载PDF的Android应用:如何添加PDF文件?

在Android应用中集成PDF并支持下载的实现方案

完全可以实现这个需求!我来给你一步步拆解具体的操作方法,都是Android开发里常用的实用方案:

第一步:把PDF文件添加到你的Android项目中

你有两个常用的存放位置可选,根据自己的需求选就行:

  • Assets目录:如果项目里没有assets文件夹,就在app/src/main目录下新建一个(和java/res同级),直接把PDF文件拖进去。注意文件名尽量简单,别用空格或特殊字符,比如user_guide.pdf。
  • Raw资源目录:在res目录下新建raw文件夹,把PDF放进去。这里的文件会被系统分配一个唯一的资源ID(比如R.raw.user_guide),后续代码里可以直接通过ID调用。

第二步:编写代码将PDF导出到外部存储(供下载/分享)

不管你把PDF存在哪个目录,核心逻辑都是把应用内的PDF文件复制到用户设备的可访问目录,然后提供下载或分享的入口。

示例1:从Assets目录读取并保存PDF(Kotlin版)

private fun savePdfFromAssets(context: Context, pdfFileName: String): File? {
    // 把PDF保存到应用专属的文档目录,Android 10+无需额外权限(适配Scoped Storage)
    val outputDir = context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)
    val outputFile = File(outputDir, pdfFileName)

    try {
        // 打开Assets里的PDF文件流
        context.assets.open(pdfFileName).use { inputStream ->
            // 写入到外部存储文件
            FileOutputStream(outputFile).use { outputStream ->
                val buffer = ByteArray(1024)
                var length: Int
                while (inputStream.read(buffer).also { length = it } > 0) {
                    outputStream.write(buffer, 0, length)
                }
            }
        }
        return outputFile
    } catch (e: IOException) {
        e.printStackTrace()
        return null
    }
}

示例2:从Raw资源目录读取并保存PDF(Kotlin版)

如果用的是Raw目录,只需要修改读取流的方式:

private fun savePdfFromRaw(context: Context, rawResId: Int, pdfFileName: String): File? {
    val outputDir = context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)
    val outputFile = File(outputDir, pdfFileName)

    try {
        context.resources.openRawResource(rawResId).use { inputStream ->
            FileOutputStream(outputFile).use { outputStream ->
                val buffer = ByteArray(1024)
                var length: Int
                while (inputStream.read(buffer).also { length = it } > 0) {
                    outputStream.write(buffer, 0, length)
                }
            }
        }
        return outputFile
    } catch (e: IOException) {
        e.printStackTrace()
        return null
    }
}

第三步:提供下载/分享入口

当你成功把PDF保存到外部存储后,就可以给用户提供操作入口了——比如点击按钮后触发保存,然后提示用户文件位置,或者直接弹出分享选项:

// 假设是从Assets读取PDF
val pdfFile = savePdfFromAssets(this, "user_guide.pdf")
pdfFile?.let {
    // 方式1:提示用户文件保存位置
    Toast.makeText(this, "PDF已保存到:${it.absolutePath}", Toast.LENGTH_LONG).show()

    // 方式2:直接弹出分享对话框
    val shareIntent = Intent(Intent.ACTION_SEND)
    shareIntent.type = "application/pdf"
    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(it))
    startActivity(Intent.createChooser(shareIntent, "选择分享方式"))
}

注意事项

  • APK体积:如果PDF文件很大或者数量多,会导致APK体积膨胀。这种情况可以考虑把PDF放到云端,用户打开应用后再下载,但如果是必须离线可用的话,还是本地集成更合适。
  • 权限问题:用getExternalFilesDir保存文件时,Android 10及以上不需要申请WRITE_EXTERNAL_STORAGE权限,因为这是应用的专属目录,用户可以通过文件管理器访问。如果要保存到公共目录(比如Downloads),则需要适配Scoped Storage或者申请对应权限。

内容的提问来源于stack exchange,提问作者HRISHIKESH KEDAR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:35:02