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




