На чем я работал:
1. Android Studio 3.6.2
2. Мобильное приложение 1С 8.3.16.142
3. 1С:Предприятие 8.3 (8.3.17.1386)
Начнем с описания функционала:
// Описание: Функция создает класс Broadcast
// Параметры:
//Обязательные.
// Фильтр- строка. Фильтр входящих или исходящих сообщений.
//Не обязательные.
// Представление - строка. если заполнено тогда в процедуре ВнешнееСобытие(Источник, Событие, Данные) встанет в событие = Представление // иначе Событие = Фильтр;
//Возвращает указатель на класс тип строка
Указатель = Компонента.CreateBroadcast(Фильтр, Представление)
// Описание: Процедура добавляет расширения для сообщения Broadcast
// Параметры:
// обязательные.
// Указатель- строка. Указатель на класс Broadcast созданный функцией CreateBroadcast;
// Расширение- строка. Имя расширения сообщения;
// Значение - строка,число,булево,число с точкой . Для приема сообщений типизирует значение расширения и является значение по умолчанию если в раширении нет или не тот тип данных. Для отправки сообщений является значением расширения и типизирует его.
// Не обязательные.
// Представление - строка. если заполнено тогда в процедуре ВнешнееСобытие(Источник, Событие, Данные) Данные это JSONСтрока где ключом является либо имя расширения либо его представлением.
Компонента.AddStringExtra(Указатель, Расширение, Значение, Представление)
// Описание: Процедура запускает процесс перехвата сообщений и отправки во "ВнешнееСобытие(Источник, Событие, Данные) "
// Параметры:
// обязательные.
// Указатель- строка. Указатель на класс Broadcast созданный функцией CreateBroadcast;
Компонента.Listen(Указатель)
// Описание: Процедура отправляет Broadcast сообщение
// Параметры:
// обязательные.
// Указатель- строка. Указатель на класс Broadcast созданный функцией CreateBroadcast;
Компонента.Send(Указатель)
// Описание: Процедура удаляет класс Broadcast;
// Параметры:
// не обязательные.
// Указатель- строка. Указатель на класс Broadcast созданный функцией CreateBroadcast;
// если не заполнен удаляются все созданные классыBroadcast
Компонента.DeleteBroadcastEvent(Указатель);
// Описание: Процедура получает данные настройки класса Broadcast;
// Параметры:
// обязательные.
// Указатель- строка. Указатель на класс Broadcast созданный функцией CreateBroadcast;
// JSONСтрока - строка. данные в JSON.
JSONСтрока = Компонента.GetBroadcastInfo(Указатель)
// Описание: Процедура создает ВнешнееСобытие
// Параметры:
// обязательные.
// Текст - строка.
// результат выполнения ВнешнееСобытие("MALutilities", "EchoExternalEvent", Текст)
Компонента.EchoExternalEvent(Текст);
// Описание:Положить текст в буфер
Компонента.CopyToClipboard(Текст);
// Описание:Получить текст из буфера
Текст = Компонента.PasteFromClipboard();
// Описание:тост - всплывающее сообщение с текстом.
Компонента.Toast(Текст)
// Описание: Количество созданных классов Broadcast
Число = Компонента.CountBroadcastEvent;
// Описание: Данные об устройстве
//DeviceInfo "{"RELEASE":"7.0","SDK":24,"BOARD":"ATOL_Smart.Lite","BOOTLOADER":"unknown","BRAND":"ATOL","DEVICE":"ATOL_Smart.Lite","DISPLAY":"B0881_C1_ATOL_V1.1.2_20190927","FINGERPRINT":"ATOL\/full_rlk6580_we_c_n\/ATOL_Smart.Lite:7.0\/NRD90M\/1569593541:user\/release-keys","HARDWARE":"mt6580","HOST":"BuildServer","ID":"NRD90M","MANUFACTURER":"ATOL","MODEL":"ATOL Smart.Lite","PRODUCT":"ATOL_Smart.Lite","RADIO_VERSION":"","TAGS":"release-keys","TIME":1569593514000,"TYPE":"user","USER":"Android13","AddIn1cInfo":{"JTHIS_PTR":"ru.mal.malutilities.DeviceClass@52963cd","JACT_PTR":"com.e1c.mobile.App@3f1b108","CPP_PTR":2382015200,"REVISIOV":109,"LOCAL_PACKEGE_NAME":"com.e1c.mobile"}}"
JSONСтрока = Компонента.DeviceInfo;
// Описание:отладка можно посмотреть версию
JSONСтрока = Компонента.InfoString;
Приступим к тестированию.
На чем я тестировал: ТСД "ATOL Smart.Lite android 7.0". Мобильное приложение 1с 8.3.15.62. IIS
1. Подключение стандартное ниже на скрине (не делал проверку при подключении.).
Важно:
Во время настройки Web-публикации следует провести следующее действие. В настройках http-сервера необходимо добавить типы MIME для следующих расширений:
- .so
- .apk
Тип MIME: application/octet-stream
2. Сделал кнопку для вкл/выкл описали события. (не судите за логику, она не важна главное это тестирования как можно большего функционала);
Код:
&НаКлиенте
Процедура Включить(Команда)
Если Не глНативКомпонента.CountBroadcastEvent Тогда
//Тост, всплывающее сообщение. 1 параметр текст сообщение. второй параметр: долгое - истина или короткое - ложь
глНативКомпонента.Toast("Начинаем!", Ложь);
глНативКомпонента.CopyToClipboard("Время открытия: " + ТекущаяДата());
//Вызывает ВнешнееСобытие("MALutilities","EchoExternalEvent","Проверка");
глНативКомпонента.EchoExternalEvent("Проверка");
Иначе
// CountBroadcastEvent - количество Broadcast
Доочистки = глНативКомпонента.CountBroadcastEvent;
// Очищает все Broadcast, если передать параметр то удалит только этот. пр. DeleteBroadcastEvent(ЭвентУказатель);
глНативКомпонента.DeleteBroadcastEvent();
ТекстТоста = "Очистка: " + Доочистки + " : " + глНативКомпонента.CountBroadcastEvent
+ " >> " + глНативКомпонента.PasteFromClipboard();
глНативКомпонента.Toast(ТекстТоста, Ложь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "MALutilities" Тогда
// получили эхо от функции EchoExternalEvent("Проверка");
Если (Данные = "Проверка" И Событие = "EchoExternalEvent") Тогда
// Создаем BROADCAST для считывателя штрих кода
ЭвентУказатель = глНативКомпонента.CreateBroadcast("com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST", "ЭтоШтрихкод");
глНативКомпонента.AddStringExtra(ЭвентУказатель,"EXTRA_BARCODE_DECODING_DATA","","Штрихкод");
глНативКомпонента.AddStringExtra(ЭвентУказатель,"EXTRA_BARCODE_DECODING_SYMBOLE","");
глНативКомпонента.Listen(ЭвентУказатель);
// посмотрим данные BROADCAST для считывателя штрих кода
ДанныеКласса = ОбщийМодульКлиент.СоздатьСтруктуруИзAndroid(глНативКомпонента.GetBroadcastInfo(ЭвентУказатель));
// Создаем BROADCAST для считывателя клавиш событие выдает AccessibilityService
ЭвентУказатель = глНативКомпонента.CreateBroadcast("ru.mal.malutilities.onKeyEvent.1");
глНативКомпонента.AddStringExtra(ЭвентУказатель,"Code",-256,"Код");
глНативКомпонента.AddStringExtra(ЭвентУказатель,"Action",-256);
глНативКомпонента.AddStringExtra(ЭвентУказатель,"Flags",-256);
глНативКомпонента.Listen(ЭвентУказатель);
// Создаем BROADCAST для AccessibilityService проверка на работу
ЭвентУказатель = глНативКомпонента.CreateBroadcast("ru.mal.malutilities.CONFIG_SERVICE.1.ECHO", "ТестСервер");
глНативКомпонента.AddStringExtra(ЭвентУказатель,"TEXT","");
глНативКомпонента.AddStringExtra(ЭвентУказатель,"NAME","");
глНативКомпонента.Listen(ЭвентУказатель);
//выдаем BROADCAST для AccessibilityService проверка на работу
ЭвентУказатель = глНативКомпонента.CreateBroadcast("ru.mal.accessibilityservice.CONFIG_SERVICE.1");
глНативКомпонента.AddStringExtra(ЭвентУказатель,"ECHO","Сервер работает");
глНативКомпонента.Send(ЭвентУказатель);
//Удаляем выданый BROADCAST для AccessibilityService
глНативКомпонента.DeleteBroadcastEvent(ЭвентУказатель);
КонецЕсли;
//Получили ответ от AccessibilityService значит работает
Если (Событие = "ТестСервер") И ОбщийМодульКлиент.СоздатьСтруктуруИзAndroid(Данные).TEXT = "Сервер работает" Тогда
// Создаем BROADCAST для AccessibilityService настраеваем его
СтруктураДанных = ОбщийМодульКлиент.СоздатьСтруктуруИзAndroid(Данные);
ЭвентУказатель = глНативКомпонента.CreateBroadcast("ru.mal.accessibilityservice.CONFIG_SERVICE.1", "ТестСервер");
//
глНативКомпонента.AddStringExtra(ЭвентУказатель, "ACTION_TYPE", 0);
//выдаем 2 BROADCAST для AccessibilityService на настройку и удаляем его можно в одном пакете
глНативКомпонента.Send(ЭвентУказатель);
глНативКомпонента.AddStringExtra(ЭвентУказатель, "FLAGS", Истина);
глНативКомпонента.Send(ЭвентУказатель);
глНативКомпонента.DeleteBroadcastEvent(ЭвентУказатель);
КонецЕсли;
//Получили события от клавиатуры или клавиш
Если (Событие <> "ТестСервер") И (Событие <> "EchoExternalEvent") Тогда
СтруктураДанных = ОбщийМодульКлиент.СоздатьСтруктуруИзAndroid(Данные);
ВнСообщения = Данные + Символы.ПС + Событие;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
3. Посмотрим точки останова.
После выполнения глНативКомпонента.EchoExternalEvent("Проверка") возникает внешнее событие. В котором мы настроим все нужные нам классы и спросим у сервиса работает он или нет.
Сервис отвечает что он работает:
После обработки ответа от сервиса, настроим его:
// какое событие ловим Если -1 тогда будут приходить данные в Action
//case "ACTION_DOWN":TypeAction = 0; break; Нажали
//case "ACTION_UP":TypeAction = 1; break; Отпустили
//case "ACTION_UP_DOWN":TypeAction = -1; break; Или нажали Или опустили
//1 - По умолчанию настроен сервис
глНативКомпонента.AddStringExtra(ЭвентУказатель, "ACTION_TYPE", 0);
// нужны ли дополнительные флаги к кнопкам Если не Истина тогда будут приходить данные в Flags
//ложь - По умолчанию настроен сервис
глНативКомпонента.AddStringExtra(ЭвентУказатель, "FLAGS", Истина);
глНативКомпонента.Send(ЭвентУказатель);
Теперь посмотрим события от кнопок(создает сервис) и сканера ШК:
Как видно обмен идет в двух направлениях. Теперь остановим все.
По коду java и С++ не чего писать не буду(и так столько написано) его много и статья ориентирована на тех кто будет использовать готовый результат. Если что, по коду java и С++, отвечу на вопросы в комментариях. Смотрите в исходниках они есть в архиве.
В Архиве исходники на сервис, компоненту и сf. В папках package уже готовые файлы. Сервис нужно устанавливать, как apk, а запускать в Настройки-Спец. возможности.
Все исходники написаны под Android Studio 3.6.2. Все, что нужно, само подгрузится.
P.S. Доработал версию добавил переменную:
// Описание: (чтение и запись) Если Истина тогда возникает события при изменении данных в буфере обмена.
Булево = Компонента.ClipboardEvent;
Компонента.ClipboardEvent = Булево;