Как получить внутри моего приложения список принтеров, ранее подключенных к службам печати Android?

#android #plugins #service #printing #printers

#Android #Плагины #Обслуживание #печать #принтеры

Вопрос:

После настройки принтера с помощью плагина служб (например, шаги 1 .. 3) в ОС Android мой рабочий процесс должен:

  • Нажмите кнопку «Печать»
  • Показать диалоговое окно с доступными принтерами (ранее определенными в настройках Android)
  • Выполнить печать PDF

Возможно ли получить этот список доступных принтеров внутри моего собственного приложения? Как?

До сих пор самым близким решением, которое я получил, просматривая документацию Google, было открыть мой PDF-файл в веб-просмотре и оттуда позволить Android обрабатывать все. Однако, если возможно, я бы не хотел нарушать мой пользовательский интерфейс. После выбора моего принтера идеальным сценарием была бы прямая печать PDF-файлов.

Заранее спасибо

——- ШАГИ ——-

  1. Настройки печати Android

Настройки печати Android]

  1. Установленные службы

Установленные службы

  1. Список принтеров

Список принтеров

Ответ №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.")
    }
}
  

Комментарии:

1. PrintService не предоставляет доступ к принтерам, которые ранее были установлены через настройки, поэтому это неприемлемое решение этого вопроса.

Ответ №2:

До сих пор не было найдено надлежащего решения. Возможные альтернативы:

  1. Попробуйте получить доступ к принтерам через общие настройки, сохраненные плагинами служб (например, PrintHand).

  2. Если вы просто хотите упростить получение IP-адреса принтера и в случае, если вы используете устройства со сканером штрих-кода, вы можете разместить на принтере ярлык с его IP-адресом и выполнить сканирование для сохранения адреса в сеансовом / одноэлементном поле.

Я выбрал второй путь.