You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android应用内PDF文件打印:如何通过Intent调用系统打印界面?

直接唤起系统打印界面实现PDF打印的方案

当然有!你完全不用啃PrinterManager的复杂样板代码,Android本身就提供了更简洁的方案——用系统Intent直接唤起打印界面,和你见过的那些PDF应用做法一模一样。

核心思路是利用Android内置的ACTION_PRINT Intent,它会自动调用系统打印服务,帮你完成打印机选择、预览、参数设置等所有流程,你只需要传入PDF文件的可访问Uri即可。

1. 打印本地存储的PDF文件(适配Android 7.0+)

Android 7.0及以上禁止直接使用file://格式的Uri,所以我们需要用FileProvider来生成安全的内容Uri,步骤如下:

第一步:配置FileProvider

AndroidManifest.xml中添加Provider配置:

<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文件,指定你存储PDF的目录(这里以应用外部存储的pdfs文件夹为例):

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="my_pdfs" path="pdfs/" />
    <!-- 可根据你的实际存储位置选择:files-path(应用内部存储)、external-root-path(外部根目录)等 -->
</paths>

第二步:编写触发打印的代码

// 假设你的PDF文件存储在应用外部存储的pdfs文件夹下
val pdfFile = File(getExternalFilesDir("pdfs"), "target_file.pdf")

if (pdfFile.exists()) {
    // 通过FileProvider生成安全Uri
    val pdfUri = FileProvider.getUriForFile(
        this,
        "${packageName}.fileprovider", // 和Manifest中配置的authorities一致
        pdfFile
    )

    // 创建打印Intent
    val printIntent = Intent(Intent.ACTION_PRINT)
    // 设置打印内容的Uri和MIME类型
    printIntent.setDataAndType(pdfUri, "application/pdf")
    // 授予系统打印服务临时读取权限
    printIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    // 可选:设置打印文档的标题
    printIntent.putExtra(Intent.EXTRA_TITLE, "我的PDF打印文档")

    // 唤起系统打印选择界面
    startActivity(Intent.createChooser(printIntent, "选择打印服务"))
} else {
    // 处理文件不存在的异常
    Toast.makeText(this, "目标PDF文件不存在", Toast.LENGTH_SHORT).show()
}

2. 打印网络PDF的处理方式

如果你的PDF文件来自网络,需要先将文件下载到应用可访问的本地存储目录(比如应用内部存储或外部存储的私有目录),然后再按照上面的流程调用打印Intent即可。

3. 关键注意事项

  • 兼容性:该方案从Android 4.4(API 19)开始支持,覆盖绝大多数主流设备。
  • 权限:如果是访问应用外部的公共存储文件,需要确保已申请READ_EXTERNAL_STORAGE权限(Android 10+推荐使用Scoped Storage,避免申请全存储权限)。
  • 自定义选项:除了设置标题,还可以通过Intent额外参数配置打印范围、份数等,具体可参考Android官方文档的Intent打印相关参数。

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

火山引擎 最新活动