Начну сразу с терминологии. Хотя здесь речь пойдет об Android, здесь попытаюсь использовать термины, использованные программистами в 1С, чтобы для них все стало более понятным и привычным. Так что, писатели кода для Android, не судите строго.
Одно из понятий и терминологий Android - это Intent - "намерение", которое генерирует приложение Android. Позволю переименовать этот термин в понятный для программиста 1С - "Оповещение" и буду использовать его дальше. Для программистов 1С укажу еще: каждое такое оповещение имеет имя данных и сами данные. Причем для каждого оповещения мы можем указать несколько данных и придать им имена.
На свой работе я как-то столкнулся с проблемой передачи данных о коде нажатой клавиши в приложение для Android "Мобильный клиент" и сканируемый штрихкод. Очень хорошую идею о том, как это сделать, я посмотрел в статье "Обработка нажатия аппаратных кнопок на ТСД в мобильной платформе." На обзор было выставлено приложение, которое отлавливает код клавиши и генерирует оповещение с определенным именем и в данных которого, передается код клавиши. Если есть внешняя компонента, которая может отловить это оповещение, то с ее помощью мы можем прочитать код клавиши уже непосредственно в клиентском приложении 1С. Так я и поступил. Поставил на ТСД программу из вышеуказанной статьи и поставил очень замечательную внешнюю компоненту Игоря Кисиля из его статьи "Многофункциональная компонента для мобильной платформы: широковещательные сообщения (broadcasts), буфер обмена (clipboard), Bluetooth", которая может перехватить оповещение с любым именем и прочитать его данные. И все бы было хорошо, но почему то некоторые терминалы в одной и той же программе для одного и того же сервера выдавали ошибку "код ошибки "0", а другие работали. Хотя в комментариях автор давал некоторые общие рекомендации, но все же проблема оставалась (причем для одних моделей сканеров все работало, для других нет). Тогда я попробовал установить другую внешнюю компоненту для сканера: "Использование встроенного сканера ТСД на Android в мобильном клиенте и мобильном приложении (драйвер сканера Android для 1С)". Она у меня запускалась и работала очень стабильно. Беда заключалась в том, что эта компонента может перехватить только одно оповещение и только данные, именованные одним именем. Допустим, что я настрою сканер штрихкода так, чтобы имя оповещения и имя данных при сканировании штрихкода совпадали с именем оповещения и данных, передаваемые от компоненты "Обработка нажатия аппаратных кнопок на ТСД в мобильной платформе." Но тогда, как мне понять, была ли нажата клавиша с кодом, например "123" или отсканирован штрихкод "123"?
Вторая проблема, с которой я столкнулся, заключается в том, что в приложении "Обработка нажатия аппаратных кнопок на ТСД в мобильной платформе" нет никаких настроек и нельзя поменять имя как оповещения, так и имя данных о коде нажатой клавиши, которое я хочу передать внешнему приложению. А вдруг на сканере штрих кода этого сделать нельзя?
Всё это побудило меня написать свой аналог приложения "Обработка нажатия аппаратных кнопок на ТСД в мобильной платформе", которое называется "Intents Catcher", которое может делать следующее.
1) Перехватывает код нажатой клавиши, кроме тех, которые добавлены в исключении
2) Перехватывает практически любое событие в Android
3) Перенаправляет данные, взятые из пп. 1) и 2) в новое событие с новым именем данных
4) Позволяет перенаправляемым данным добавить префикс и суффикс (окончание), чтобы потом по префиксу можно было понять, какое событие передано
5) Имеет изменяемые настройки для осуществления всего вышеперечисленного.
6) Позволяет посмотреть код клавиши, штрихкод в самом приложении.
Прилагаю инструкцию, как это все должно работать на примере компоненты из статьи "Использование встроенного сканера ТСД на Android в мобильном клиенте и мобильном приложении (драйвер сканера Android для 1С)".
Допустим нас есть ТСД, на котором при чтении штрих-кода генерируется оповещение c именем, например "android.intent.barcode" и данными с именем "barcode" и поменять это никак нельзя. При этом нам надо еще умудриться в приложение передать код нажатой клавиши и что-то еще другое...
1. Ставим приложение "Intents Catcher". В нем включаем возможность перехватывать клавиши и задаем имя единого оповещения, выходящего из приложения "android.intent.catcher", чтобы внешняя компонента получила ответ из этого приложения. В компоненте устанавливаем параметр "ActionName" с таким же значением:
ОбъектДрайвера.УстановитьПараметр("ActionName", "android.intent.catcher");
Выбираем "Output Intent"
Экран основного окна и меню. |
Настройка имени выходящего оповещения |
2. Включаем возможность перехватывать коды клавиш из пункта меню "Keys trap". Присваиваем имя данных о коде, совпадающим с именем данные, которые способна обработать внешняя компонента - "data". Добавляем префикс, например: "key=<", и суффикс ">". Тогда внешняя компонента будет получать при нажатии клавиши и кодом "8" такие данные "key=<8>"
Настройки перехвата клавиш. "Exclude keys" означает, что не надо обрабатывать клавиши с указанными кодами |
3. Добавляем в приложении возможность отловить событие от сканера штрихкода, а именно событие с именем "android.intent.barcode" и именем данных "barcode" и тоже пересылаем эти данные, но уже с другим именем "data" и добавляем префикс "barcode=<" и суффикс ">". В результате внешняя компонента будет получать штриход "1234567890" как "barcode=<1234567890>".
Список перехватчиков оповещений. Сейчас он пуст. Нажимаем "ADD INTENT" |
Настройка перехвата оповещения от сканера | Список перехватчиков после добавления перехвата оповещения от сканера |
Далее в программе 1С по префиксу мы уже понимаем, с чем мы имеем дело с клавишей или штрихкодом. Аналогичным способом можно будет добавить практически любое событие.
4. Возвращаемся в основное окно приложения. Теперь на надо запустить сервис, который будет отлавливать нажатие клавиш и настроенные оповещения, а затем пересылать их как новое оповещение. Переходим к сервису через пункт меню "Go to service".
Соглашаемся запустить сервис(нажимаем Allow)
Список сервисов. Наш называется "Intents catcher service". Переходим в него. |
Переводим ползунок "Use Intents catcher service" во включенное положение. | Сервис запущен. |
Если мы вновь захотим изменить настройки, тогда после изменения настроек программы будет необходимо перезапустить сервис, т.к. он считывает настройки при старте сервиса. Для этого надо перейти к сервису, выключить ползунок "Use Intents catcher service", а затем снова его включить.
5. Теперь мы сможем проверить результаты своих настроек не только в 1С, но и в самом приложении в главном окне. При нажатии клавиши или при сканировании штрихкода в окне будет отображаться данные.
Данные при нажатии клавиш |
6. Теперь необходимо указать имя принимаемых данных компоненте:
ОбъектДрайвера.УстановитьПараметр("ExtraName", "data");
6. Теперь необходимо внести изменения в обработчик внешнего события от драйвера в 1С, например, так:
Процедура ОбработатьСобытие(Источник, Событие, Данные) Экспорт
Если Лев(Данные,5)="key=<" И Прав(Данные,1)=">" Тогда
КодКлавиши = Сред(Данные,6,стрДлина(Данные)-7);
//Обрабатываем нажатие клавиши
ИначеЕсли Лев(Данные,9) = "barcode=<" И Прав(Данные,1)=">" Тогда
Штрихкод = Сред(Данные,10,стрДлина(Данные)-10);
//Обрабатываем штрихкод
КонецЕсли;
КонецПроцедуры
И напоследок хочу поблагодарить всех авторов указанных мною выше статей за их огромный вклад в наше общее дело!