Получение широковещательных сообщений (broadcasts) с помощью внешней компоненты для мобильных приложений (ОС Андроид)

Программирование - Внешние компоненты

Представлена компонента для получения широковещательных оповещений в ОС Андроид.

Продолжение статьи автора о внешних компонентах для мобильных приложений, в которой представлен развернутый пример компоненты получения широковещательных оповещений в андроиде (broadcasts). Идею ее создания подсказала работа //infostart.ru/public/587908/, в которой был предложен универсальный получатель сообщений от сканеров, но решение выполнено через сервис, хотя ничто не мешает оформить его в виде компоненты. Архитектурный выигрыш несомненный, но главные удобства получает пользователь, которому нужно будет установить только приложение 1С без дополнительного ПО.

Для подключения компоненты используем стандартный код:

// Component - имя макета, в котором находится компонента

ПодключитьВнешнююКомпоненту("ОбщийМакет.Component", "Broadcasts", ТипВнешнейКомпоненты.Native);
Компонента = Новый("AddIn.Broadcasts.UniversalBroadcast");

Так как решение полностью выполнена по стандарту 1С (устройство ввода), установка параметров выполняется методом "УстановитьПараметр", включение и выключение - "Подключить" и "Отключить" соответственно. Параметр, который обязательно нужно установить - "FilterName", это имя оповещения. Для сканеров его необходимо взять из документации. Также можно использовать любые системные броадкасты, например отсюда. В примере конфигурации к статье представлен способ получения информации о батарее устройства. Следующий важный параметр - "CaptureData". В него следует передать XML строку с описанием извлекаемых дополнительных данных оповещения. Для удобства ее можно получить, вызвав метод "ПолучитьШаблонОписанияДанных", который возвращает строку:

<?xml version="1.0" encoding="utf-8"?>
<dataExtra name="%1" arrayToString="%2" dataType="%3" />

Она содержит три параметра в формате %n, чтобы ее было удобно использовать в методе "ПодставитьПараметрыВСтроку" из БСП. Первый параметр - имя дополнительных данных. Второй должен иметь значения true или false и используется только для обработки массива байт или символов (см. ниже). Третий параметр - число, тип извлекаемых данных в соответствии с таблицей:

Значение параметра Тип данных
0 строка
1 массив строк
2 short
3 массив типов short
4 long
5 массив типов long
6 int
7 массив типов int
8 float
9 массив типов float
10 double
11 массив типов double
12 символ
13 массив символов
14 байт
15 массив байтов
16 булево
171617 булевомассив типов булево

Для массивов типов байт или символ параметр attayToString может быть установлен в true. В этом случает при получении дополнительных значений, они будут преобразовываться в строку. Это может пригодится для работы с некоторыми сканерами, которые возвращают результат в виде набора байтов. Покажем код установки параметров перед включением компоненты:

ШаблонДанных = Компонента.ПолучитьШаблонОписанияДанных();
health = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,"health",XMLСтрока(Ложь),XMLСтрока(6));
Компонента.УстановитьПараметр("CaptureData",health);
tech = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,"technology",XMLСтрока(Ложь),XMLСтрока(0));
Компонента.УстановитьПараметр("CaptureData",tech);
present = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,"present",XMLСтрока(Ложь),XMLСтрока(16));
Компонента.УстановитьПараметр("CaptureData",present);
level = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,"level",XMLСтрока(Ложь),XMLСтрока(6));
Компонента.УстановитьПараметр("CaptureData",level);

Какие данные необходимо получить мы определяем последовательными вызовами установки параметра CaptureData. Удалить или изменить этот набор после установки невозможно, для этого необходимо пересоздать объект компоненты.

После включения компонента, как и любое устройство ввода, возвращает данные через внешнее событие 1С. Первый параметр события - серийный номер устройства, второй параметр имеет значение "UniversalBroadcastEvent", а третий - текст в формате XML примерно такого вида:

<?xml version="1.0" encoding="utf-8"?>
<MessageData>
<FilterName>Имя оповещения, заданного параметром FilterName</FilterName>
<FilterData name="имя очередного параметра CaptureData">Значение дополнительных данных</FilterData>
<FilterData name="имя очередного параметра CaptureData">
<ArrayValue>элемент 1 массива данных</ArrayValue>
<ArrayValue>элемент 2 массива данных</ArrayValue>
</FilterData>
</MessageData>

Как можно догадаться из примера, значения одиночных дополнительных данных возвращаются в тексте элемента <FilterData>, а массивов элементами <ArrayValue>.

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

Изменение от 02.06.18 Разработчики мобильной платформы в релизе 8.3.12.64 исправили ошибку, из-за которой мобильное приложение после загрузки компоненты и закрытии не выгружалось из памяти. Я обходил ее, используя функции linux-ядра андроида для генерации внешних событий в 1С. С выходом новой версии нужды в таком коде нет. Поэтому предлагаю новую версию компоненты, которую рекомендуется использовать только с релизом 8.3.12.64 мобильной платформы.

Скачать файлы

Наименование Файл Версия Размер
Получение широковещательных сообщений (broadcasts) с помощью внешней компоненты для мобильных приложений (ОС Андроид):
.cf 1,38Mb
05.02.18
12
.cf 1.0.1 1,38Mb 12 Скачать

См. также

Комментарии
1. Алексей Шачнев (saa@kuzov.org) 02.03.18 23:47 Сейчас в теме
Спасибо!
А исходники этой ВК можно увидеть?
2. Сергей Евстигнеев (greyhedgehog) 2 17.05.18 12:51 Сейчас в теме
Игорь, спасибо! Очень помогла компонента для работы со встроенным сканером в ТСД Honeywell EDA50K.
10. Сергей Неумывакин (s.neumyvakin_2015) 09.06.18 13:24 Сейчас в теме
(2)Добрый день! Напиши пожалуйста как ты настраивал компоненту. Четвертый день ума не могу дать ТСД Honeywell EDA50K
11. Сергей Евстигнеев (greyhedgehog) 2 09.06.18 15:08 Сейчас в теме
(10) Там основные настройки надо на ТСД производить:

в ТСД:
Настройки --> Scan Settings --> Internal Scanner --> Default profile --> Data Processing Settings -->
Поставить галку Scan to Intent. Ткнуть в поле Data Intent (Именно в строку, а не в галку), откроются настройки Data Intent. Там поставить галку Data Intent и в поле Action вбить произвольное уникальное имя действия. Я ввел: "scan.rcv.message" (без кавычек).

Дальше, в конфигурации-примере Игоря, надо немного код изменить с батарейки на ШК:

В конфигурации, в общей форме FormMain можно прям в ПриСозданииНаСервере() прописать ИмяСобытия = "scan.rcv.message"; (этот имя события, которое задал в настройках ТСД, у меня это "scan.rcv.message").
А в процедуре ПриОткрытии() вместо строк с получением состояния батареи прописать поле "data", из которого получать данные:
barcode = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,"data",XMLСтрока(Ложь),XMLСтрока(0));
Компонента.УстановитьПараметр("CaptureData",barcode);
3. Сергей Евстигнеев (greyhedgehog) 2 17.05.18 16:41 Сейчас в теме
Поторопился похвалить. На мобильной платформе 8.3.11.61 на указанном выше устройстве (Android 4.4.4) после подключения компоненты (именно после нажатия кнопки "Старт" в форме) даже на чистом примере с определением состояния батареи непредсказуемо начинает жутко тормозить интерфейс или вообще "падает" приложение в течение нескольких десятков секунд. До подключения все работает. Не подскажете, возможно ли это исправить? Очень нужна стабильная работа на устройстве.
Спасибо.
4. Игорь Кисиль (IgorKissil) 121 17.05.18 22:22 Сейчас в теме
Проверил на указанной платформе и 8-м андроиде - все ОК. Проверить на 4-м сейчас не могу. Но вполне допускаю, что могут быть проблемы. Я до сих пор держу два сборщика мобильных приложений под рукой, один "свежий", другой с платформой 8.3.9, ибо ТСД у одного клиента с 4м андроидом работают только с этой платформой.
5. Сергей Евстигнеев (greyhedgehog) 2 17.05.18 23:47 Сейчас в теме
(4) Спасибо. Да, похоже дело в версии Андроида, на телефоне с 6-м работает, а на телефоне с 4-м такое же поведение. К сожалению ТСД на 4-м и ее не обновить, попробую с платформой 8.3.9 поэкспериментировать.
7. Игорь Кисиль (IgorKissil) 121 29.05.18 07:44 Сейчас в теме
(5) Проверил на эмуляторе 4-го андроида - пример к статье работает. Увы, физических устройств с этой версией у меня нет. На терминале с 5-м адроидом тоже все в порядке.
8. Игорь Кисиль (IgorKissil) 121 02.06.18 19:47 Сейчас в теме
(5) Обновил пример для новой мобильной платформы
6. Игорь Кисиль (IgorKissil) 121 18.05.18 08:33 Сейчас в теме
попробуйте собрать под sdk ниже 25
9. Сергей Евстигнеев (greyhedgehog) 2 09.06.18 09:38 Сейчас в теме
Спасибо. Обновленная версия примера работает стабильно, по крайней мере на имеющемся у меня телефоне с Android 5.0.1 и на ТСД с Android 7.1.1 проблем больше нет. На ТСД перенастроил компоненту на событие от сканера штрихкода, ШК перехватываются замечательно. Специально проверил на предмет описанных в некоторых статьях пропусков при сканировании ШК, у меня на ТСД не получилось заставить пример пропускать сканирования, даже при очень интенсивной работе, при последовательном сканировании нескольких ШК, все работало.
Оставьте свое сообщение