#android #plugins #service #printing #printers
#Android #Плагины #Обслуживание #печать #принтеры
Вопрос:
После настройки принтера с помощью плагина служб (например, шаги 1 .. 3) в ОС Android мой рабочий процесс должен:
- Нажмите кнопку «Печать»
- Показать диалоговое окно с доступными принтерами (ранее определенными в настройках Android)
- Выполнить печать PDF
Возможно ли получить этот список доступных принтеров внутри моего собственного приложения? Как?
До сих пор самым близким решением, которое я получил, просматривая документацию Google, было открыть мой 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.")
}
}
Комментарии:
1. PrintService не предоставляет доступ к принтерам, которые ранее были установлены через настройки, поэтому это неприемлемое решение этого вопроса.
Ответ №2:
До сих пор не было найдено надлежащего решения. Возможные альтернативы:
-
Попробуйте получить доступ к принтерам через общие настройки, сохраненные плагинами служб (например, PrintHand).
-
Если вы просто хотите упростить получение IP-адреса принтера и в случае, если вы используете устройства со сканером штрих-кода, вы можете разместить на принтере ярлык с его IP-адресом и выполнить сканирование для сохранения адреса в сеансовом / одноэлементном поле.
Я выбрал второй путь.