我正在为 Android 创建一个应用程序。所需的应用程序功能的一部分是用户可以选择一个特殊的打印机(我们将其称为传输打印机),它将将要打印的文档传递到在外部服务器上运行的进程。
我需要采取哪些步骤才能将自定义打印机添加到 Android 打印面板中的打印机列表(可通过“溢出”菜单的“打印”选项进行访问)?
出于用户体验考虑,最好使用现有的 Android 打印面板功能,而不是应用程序选择器中的附加共享选项;对于用户来说,单击“共享”而不是“打印”以获得所需的功能并不直观。
有一个现有的类似问题,自从不久前发布以来,没有引起多少兴趣。提问者已将 PrintManager 类确定为主导,但我相信PrintService类可能会更富有成果:
打印服务负责发现打印机、添加已发现的打印机、删除已添加的打印机以及更新已添加的打印机。
同一页详细介绍了打印服务的声明和配置。我已经这样做了,如下所示。
在AndroidManifest.xml中:
...
<application
... >
...
<service
android:name=".TransferPrintService"
android:permission="android.permission.BIND_PRINT_SERVICE"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.printservice.PrintService" />
</intent-filter>
<meta-data
android:name="android.printservice"
android:resource="@xml/transfer_print_service" />
</service>
</application>
Run Code Online (Sandbox Code Playgroud)
我不清楚元数据应该在哪里指定。从 PrintService 页面的 SERVICE_META_DATA 部分:
该元数据必须引用包含打印服务标记的 XML 资源。
在 res/xml/transfer_print_service.xml 中:
<print-service
android:label="TransferPrintService"
android:vendor="Company Ltd." />
Run Code Online (Sandbox Code Playgroud)
这将创建一个自定义 PrinterDiscoverySession。我现阶段的目标是让打印机出现在打印面板中并从那里开始工作。
public class TransferPrintService extends PrintService {
public TransferPrintService() {
}
@Override
public void onPrintJobQueued(PrintJob printJob) {
printJob.start(); …Run Code Online (Sandbox Code Playgroud)