В статье я опишу процес печати с двух сторон: самой операционной системы и совместимого принтера.

Печать появилась в операционной системе Android только в 4й версии. Изначально, она была в основном ориентирована на GCP (облачная печать от гугла).

Привычный нам вид она приобрела начиная с 5-й версии, дизайн которой не менялся много лет.

Со стороны операционной системы в процессе печати участвуют четыре роли :

Клиенты, менеджер и подрядчики с исполнителями (это мной придуманые названия так как с официальной терминологией не все так однозначно)

Клиент - программа, которая хочет вывести, что-то на печать.

Менеджер задает клиенту уточняющие вопросы как это нужно сделать и предлагает на выбор исполнителей.

После окончательного согласования работа передается подрядчику.

Экран, на котором и происходит согласование.

В роле менеджера выступает системная служба печати.

Сложнее с правильным названием для подрядчика. По сути это драйвер принтера. Но такое название почему то не используется. А называются они модулем, плагином и даже службой

У андроида есть свой афилированный подрядчик - BuiltInPrintService и опять совпадение по слову служба с менеджером, который разруливает.

Исходные коды можно нагуглить по запросу package com.android.bips;

Основной взаимодействия службы печати и сервиса(плагина) выступают понятия "задание печати" и "сессия разрешения". В момент, когда пользователь решил распечатать, операционная система опращивает все установленые на телефоне сервисы печати с просьбой отчитаться какие у них есть принтеры, какие у них возможности (цветность, размер бумаги, дуплекс)

Когда пользователь меняет свой выбор, то программу клиента, спрашивают не желает ли она предоставить перерисованную пдфку под текущий выбор.

Пользователь нажал на зеленую кнопку печати. Служба еще раз запросила актуальную пдфку. И формирует задание на печать сервису.

Сервис должен подтвердить, что принял ее в работу или поставил в очередь. По ходу работы он может посылать прогрес печати и обязан закончить ее одним из статусов (успех, ошибка, отмена пользователем)

Вот мы и почьти добрались до второй стороны - принтера.

BuiltInPrintService умеет печатать только на IPP (Internet Printing Protocol) принтеры используя для их поиска mDNS.

 NsdServiceInfo serviceInfo = new NsdServiceInfo();
 serviceInfo.setServiceName("IppVirtual");
 serviceInfo.setServiceType("_ipp._tcp");
 serviceInfo.setPort(PORT);

serviceInfo.setAttribute("UUID", S_UUID);
serviceInfo.setAttribute("rp", IppService.RP);

serviceInfo.setAttribute("ty", "IppVirtual");
serviceInfo.setAttribute("note", "my android device");

 if (mNsdManager == null) {
    mNsdManager = (NsdManager)
      context.getApplicationContext().getSystemService(Context.NSD_SERVICE);
  if (mNsdManager == null) return;
}

myNsdListener = new MyNsdListener();
mNsdManager.registerService(
  serviceInfo, NsdManager.PROTOCOL_DNS_SD, myNsdListener);

На практике, встроенная служба андроид использует только несколько полей. Нужен UUID отслеживания смены ip адреса. Сервис уважает желание принтера, чтобы его не беспокоили ("print_wfds","F"), а вот всю остальную информацию предпочитает получать через выполнение операции "свойства принтера" IPP протокола. Таким образом нужно три вещи (нет запрета печатать, UUID, rp)

Посмотреть как ваш принтер себя анонсирует в сети можно с помощью классной программы

Не пожалейте автору звездочек за бесплатную программу. Я поставил.

Если говорить про как сделать тоже самое с андроид телефона, то можно поискать отдельные программы или же воспользоваться вкладкой диагностики в ps402d.

Продолжение следует