如何在我的应用程序中获取以前使用 android 打印服务的打印机列表?

Posted

技术标签:

【中文标题】如何在我的应用程序中获取以前使用 android 打印服务的打印机列表?【英文标题】:How to get, inside my app, a list of printers previously settle to android printing services? 【发布时间】:2019-04-03 17:22:30 【问题描述】:

android 操作系统上通过服务插件(例如步骤 1..3)设置打印机后,我的工作流程应该:

按“打印”按钮 显示可用打印机对话框(之前在 Android 设置中定义) 执行 pdf 打印

是否可以在我自己的应用程序中获取此可用打印机列表?怎么样?

到目前为止,我通过谷歌文档运行的最接近的解决方案是在网络预览中打开我的 pdf,然后让 Android 处理所有事情。但是,如果可能的话,我不想破坏我的用户体验。选择我的打印机后,理想的情况是直接打印 pdf。

提前致谢

------- 步骤 -------

    Android 打印设置

    已安装的服务

    打印机列表

【问题讨论】:

【参考方案1】:

是否可以在我自己的应用程序中获取此可用打印机列表?怎么样?

是的,您可以使用PrintService:https://developer.android.com/reference/android/printservice/PrintService

打印服务负责发现打印机、添加发现的打印机、删除添加的打印机以及更新添加的打印机。

Android 文档也有(有些过时,但仍然有用)关于使用打印相关 API 的课程:https://developer.android.com/training/printing

此示例包含与打印 PDF 相关的代码:https://developer.android.com/training/printing/custom-docs

来自文档的示例代码:

// Connect to the print manager
private fun doPrint() 
    activity?.also  context ->
        // Get a PrintManager instance
        val printManager = context.getSystemService(Context.PRINT_SERVICE) as PrintManager
        // Set job name, which will be displayed in the print queue
        val jobName = "$context.getString(R.string.app_name) Document"
        // Start a print job, passing in a PrintDocumentAdapter implementation
        // to handle the generation of a print document
        printManager.print(jobName, MyPrintDocumentAdapter(context), null)
    

// Compute print document info
override fun onLayout(
        oldAttributes: PrintAttributes?,
        newAttributes: PrintAttributes,
        cancellationSignal: CancellationSignal?,
        callback: LayoutResultCallback,
        extras: Bundle?
) 
    // Create a new PdfDocument with the requested page attributes
    pdfDocument = PrintedPdfDocument(activity, newAttributes)

    // Respond to cancellation request
    if (cancellationSignal?.isCanceled == true) 
        callback.onLayoutCancelled()
        return
    

    // Compute the expected number of printed pages
    val pages = computePageCount(newAttributes)

    if (pages > 0) 
        // Return print information to print framework
        PrintDocumentInfo.Builder("print_output.pdf")
                .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
                .setPageCount(pages)
                .build()
                .also  info ->
                    // Content layout reflow is complete
                    callback.onLayoutFinished(info, true)
                
     else 
        // Otherwise report an error to the print framework
        callback.onLayoutFailed("Page count calculation failed.")
    

【讨论】:

PrintService 不提供对以前通过“设置”解决的打印机的访问权限,因此这不是该问题可接受的解决方案。【参考方案2】:

到目前为止,还没有找到合适的解决方案。可能的替代方案是:

    尝试通过服务插件(例如 PrintHand)存储的共享首选项访问打印机。

    如果您只是想轻松获取打印机的 IP 地址以及使用带有条形码扫描仪的设备的情况,您可以在打印机上放置一个带有 IP 地址的标签并进行扫描以存储地址在会话/单例字段上。

我选择了第二条路。

【讨论】:

以上是关于如何在我的应用程序中获取以前使用 android 打印服务的打印机列表?的主要内容,如果未能解决你的问题,请参考以下文章

设计android应用程序时如何在我的应用程序中获取谷歌广告ID?

如何在 android 上使用 sqlcipher 读取以前在 pc 上创建的加密数据库?

如何获取通知 onesignal 的内容并将其显示在我的 android 应用程序中

如何在 android Kotlin 中获取以前的活动

如何在 android 10 或更高版本中获取设备 ID 或 imei 号码

如何监控我的应用在 android 中发出的 HTTP(获取、发布等)请求