Android Java и NativAPI C++ внешняя компонента для широковещательных сообщений (отправка и прием). Подключаем сканер ШК и клавиатуру к "1С мобильное приложение"
Разработка - Разработка внешних компонент
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
| Наименование | Скачано | Купить файл | По подписке PRO |
|---|---|---|---|
|
компонента, сервис, цф и исходники - старая версия не поддерживается.
.zip 11,57Mb
138
|
138 | 2 500 руб. Купить | 1 SM Скачать |
|
компонента (+ печать на блютуз принтерах этикеток), исходник(Android Studio Koala | 2024.1.1 Patch 2) для андроид 6 и выше. В папке pakage готовые zip 1c
.zip 11,42Mb
6
|
6 | 2 500 руб. Купить | 1 SM Скачать |
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
На чем я работал:
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;
P.S.
// Новая функция для приема сообщений в виде двоичных данных преобразованных в BASE64.
// Реализовано только в новой версии.
// Описание: Процедура добавляет расширения для сообщения Broadcast
// Параметры:
// обязательные.
// Указатель- строка. Указатель на класс Broadcast созданный функцией CreateBroadcast;
// Расширение- строка. Имя расширения сообщения;
// Не обязательные.
// Представление - строка. если заполнено тогда в процедуре ВнешнееСобытие(Источник, Событие, Данные) Данные это JSONСтрока где ключом является либо имя расширения либо его представлением.
Компонента.AddBase64(Указатель, Расширение, Представление);
Приступим к тестированию.
На чем я тестировал: ТСД "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 = Булево;

P.S. 2 Обнаружил что на новой версии андроид студия, проект не собрать - переделал.
Для - "Android Studio Koala | 2024.1.1 Patch 2"
Добавлено:
1. В "DeviceInfo" добавлены данные по IP адресу и еще данные
2. Новое свойство "ExitAfterDestruct" если установить в "Истина" тогда при выходи из приложения также закрывается список баз 1с (актуально для приложений которые не соберают в апк).
3. Добавлена возможность печати на блютуз принтерах этикеток. Пример ниже:
Процедура ОбновитьСписокПринтеров(ТекущийПринтер, БТПринтеры) Экспорт
БТПринтеры = Новый СписокЗначений;
МасивСтркутурВсегоОборудованиеБлютуз = ПрочитатьЗначениеJSON(Компанента.GetBluetoothDevicelist());
Для Каждого Оборудования Из МасивСтркутурВсегоОборудованиеБлютуз Цикл
Если Оборудования.Name = "RG-MLP80B" Или Лев(Оборудования.Name, 8) = "SPP-L310" Тогда
БТПринтеры.Добавить(Оборудования, Оборудования.Name, ТекущийПринтер.Имя = Оборудования.Name);
КонецЕсли;
//ТекущийПринтер = Оборудования; Структура
КонецЦикла;
КонецПроцедуры
Процедура ПечатьХолоВорд(ТекущийПринтер)
Текст = "!0 200 200 210 1
|TEXT 4 0 30 40 Hello World
|FORM
|PRINT"
БТПринтер = ЗаписатьЗначениеJSON(ТекущийПринтер);
Компанента.Print(БТПринтер, Текст);
КонецПроцедуры
//Реализация новой функции:
Если АндройдОС.MODEL = "PDA" Тогда
ЭвентУказатель = глУтилиты.CreateBroadcast("com.action.SCAN_RESULT", "ЭтоШтрихкод");
глУтилиты.AddBase64(ЭвентУказатель, "scanContext", "ШК_BASE64");
КонецЕсли
//ОбработкаСобытия
Функция ПолучитьШК(Источник, Событие, Данные) Экспорт
ШК_Строка = Неопределено;
Если Источник = "MALutilities" И Событие = "ЭтоШтрихкод" Тогда
ОписаниеШК = ПрочитатьЗначениеJSON(Данные);
Если Не ОписаниеШК.Свойство("ШК_Строка", ШК_Строка) И ОписаниеШК.Свойство("ШК_BASE64", ШК_Строка) Тогда
ШК_Строка = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(ШК_Строка));
КонецЕсли;
КонецЕсли;
Возврат ШК_Строка;
КонецФункции
P.S. 3 В новой сборке, если не указать расширения, тогда вернутся все данные.

Вступайте в нашу телеграмм-группу Инфостарт
См. также
Сканер штрих-кода Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Управленческий учет Платные (руб)
У вас возникал вопрос - Как быстро и правильно выполнить приемку товара в торговой точке? Как минимизировать ошибки при сборке заказа клиента? Текущая разработка способна помочь в решении данных проблем. Её назначение - проверка с помощью сканера штрих кода поступления и реализации товаров, заказов клиентов, заказов поставщикам, расходных и приходных ордеров, перемещений и возвратов.
5185 руб.
29.07.2020 46907 248 194
Мобильная разработка Сканер штрих-кода Терминал сбора данных 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)
Сбор заказов, инвентаризация, проверка ценников, просмотр полной информации об остатках и ценах со смартфона Онлайн - все это содержит в себе решение 1С "Штрихкод-информер" (штрих-код чекер). Отправка данных со смартфона выполняется либо напрямую в открытую форму документа, отсканировав QR-код, либо в общую корзину учетной системы, не подходя к компьютеру. Кассир или оператор сможет просмотреть список присланных данных и загрузить в любую форму, поддерживающую работу с ТСД. Для работы с мобильным приложением требуется опубликовать HTTP-сервис из поставляемого расширения.
3050 руб.
03.12.2018 72927 250 108
Сканер штрих-кода Терминал сбора данных Мобильная разработка Монитор заказов Оптовая торговля Розничная торговля Ценообразование, анализ цен Разработчик Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)
Простой мобильный ТСД (терминал сбора данных) сканер для 1С для смартфонов на iOS и Android, не требующий сложных настроек и установки дополнительных программ. Обмен между Вашей 1С и мобильным приложением осуществляется через облачный сервис и расширение конфигурации. Работает с конфигурациями УТ 11, ERP, КА2, Розница 2, Розница 3, УНФ 1.6, УНФ 3.0. Полнофункциональный демо-доступ для своей конфигурации можно запросить в настройках мобильного приложения - все необходимое придет на почту автоматически. Решение предназначено для считывания штрихкодов, а не для их создания и печати.
3050 руб.
22.04.2019 124923 739 207
Сканер штрих-кода Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)
Стандартные конфигурации ERP, КА, УТ 11 позволяют работать с штрихкодированием серий. Есть только одно суровое ограничение – на упаковке должна быть этикетка для номенклатуры и отдельно для серии. Во многих случаях это критически неудобно.
24400 руб.
19.04.2021 31073 70 59
Учет ОС и НМА Сканер штрих-кода Терминал сбора данных Логистика, склад и ТМЦ 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)
Приложение Инвентаризация ОС и ТМЦ предназначено для инвентаризации основных средств и товарно-материальных ценностей, закреплённых за конкретным материально ответственным лицом или складом. В конфигурации 1С:Бухгалтерии 3.0 отсутствуют возможности генерации и работы со штрих-кодами для основных средств. Приложение позволяет генерировать и обрабатывать штрих-коды как для основных средств, так и для товарно-материальных ценностей (материалы, товары). В новом релизе появилась возможность работы с фотографиями объектов учета.
07.07.2023 7018 4 alfanika 2
Сканер штрих-кода Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 Бухгалтерский учет Платные (руб)
Теперь практически все торговые документы в конфигурации 1С Бухгалтерия 3.0 (ПРОФ / КОРП) и в конфигурации 1С Бухгалтерия сельскохозяйственного предприятия 3.0 поддерживают подбор товара по штрих-коду. Можно пользоваться сканером штрихкода или подбирать штрих-код вручную. В основных печатных формах документов выводится колонка Штрихкод. Для менеджеров по продажам будет удобным дополнительный отчет Прайс-лист с остатками и штрих-кодом.
7320 руб.
28.07.2020 33374 88 37
Сканер штрих-кода Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Терминал сбора данных Мобильная разработка Разработчик Пользователь 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Управленческий учет Платные (руб)
Android смартфон как беспроводной сканер штрих-кодов, QR-кодов (2D), терминал сбора данных (ТСД), подписка на штрих-код Комбайн
2196 руб.
18.01.2017 152663 235 237
Разработка внешних компонент Телефония, SIP Разработчик 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)
Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)
5246 руб.
04.05.2018 52186 128 68
Компонента написана на C++ и Java одновременно? Почему так?
А в настройках сканера включен броадкаст? Если да то попробуйте функцией "Send" отправить самому себе тот броадкаст который в настройках сканера.
При этом Send выдаст сообщение в очередь Android, а затем его перехватит 1с.
// Описание: Процедура отправляет Broadcast сообщение
// Параметры:
// обязательные.
// Указатель- строка. Указатель на класс Broadcast созданный функцией CreateBroadcast;
Компонента.Send(Указатель)
примерно так:
ЭвентУказатель = глНативКомпонента.CreateBroadcast("Какойта фильтр", "Тест");
глНативКомпонента.Listen(ЭвентУказатель);
глНативКомпонента.Send(ЭвентУказатель);
Читая инструкцию по настройки ATOL Smart.pro я НЕ нашёл настройку броадкастов. только клавиатура и буфер обмена.
Киньте скрин с вашими настройками.
Вот так настраевается в "ATOL Smart.Lite:
Не важно как вы настроите расширения функцией AddStringExtra(можно вобще не настраивать). Главное это ФИЛЬТР на скрине "Action name".
На ТСД есть еще Broadcast intnet (. Там в данный момент стоят такие настройки: .
Сейчас настроено так:
ЭвентУказатель = глНативКомпонента.CreateBroadcast("com.hht.scanwedge", "ЭтоШтрихкод");
глНативКомпонента.AddStringExtra(ЭвентУказатель,"com.hht.datawedge.data_string","","Штрихкод");
глНативКомпонента.AddStringExtra(ЭвентУказатель,"com.hht.datawedge.label_type","");
Возможно, просто что-то не так заполнено?
Компонента вроде правильно настроена.
Попробуйте:
1. Установить "SEND BARCOD DATA" с "Clipbord" в "off"
2. Очистить в намерениях категорию "Intent->Category"
К сожалению нет этого аппарата под рукой .
Попробуйте что то типо токого (первое что нашол не знаю работает или нет): - посмотри идут события от него или нет.
падает на второй строке глНативКомпонента = Новый("AddIn.rumalutilities.MALutilities");
Похоже не удается подключить компоненту.
Есть идеи как пофиксить?
Во время настройки Web-публикации следует провести следующее действие. В настройках http-сервера необходимо добавить типы MIME для следующих расширений:
.so
.apk
Тип MIME: application/octet-stream
Теперь все работает спасибо
На мобильном приложении не загружается компонента. ПодключитьВнешнююКомпоненту всегда возвращает ложь без ошибок
Типы .so и .apk как в (17) прописал - не помогает. Что еще можно попробовать ?
Попробуйте настроить Мимы( .so и .apk) в корне IIS если они у вас на сайт прописаны.
ПодключитьВнешнююКомпоненту("ОбщийМакет.Макет", "rumalutilities", ТипВнешнейКомпоненты.Native);
глНативКомпонента = Новый("AddIn.rumalutilities.MALutilities");
Тип не определен AddIn.rumalutilities.MALutilities
ЭвентУказатель = глBroadcast.CreateBroadcast("ru.mal.malutilities.onKeyEvent.1");
глBroadcast.AddStringExtra(ЭвентУказатель,"Code",-256,"Код");
глBroadcast.AddStringExtra(ЭвентУказатель,"Action",-256);
глBroadcast.AddStringExtra(ЭвентУказатель,"Flags",-256);
глBroadcast.Listen(ЭвентУказатель);
то после сканирования штрихкода вызываются два события одно штрихкод ( к примеру 12229309), а потом ru.mal.malutilities.onKeyEvent.1 с данными {"Action":-256,"Flags":8,"Код":119}. Как понять что onKeyEvent не нужно обрабатывать ?
И если такого сделать невозможно, то как заставить что бы всегда (неважно нажата кнопка или отсканирован штрихкод) порядок следования событий был одинаков ?
Только программно. У меня на ТСД кнопка сканирования отдельная (нет не каких задач кроме сканирования). и ее код я не обрабатываю. Есть вариант поправить сервис, исходники его в архиве. Или переназначить кнопку сканирования в настройках сканера.
Можно при каждом сканировании ШК менять представление например текущая дата или инкремент переменной, и разделять по времени события или по индексу события.
Компонента.AddStringExtra(Указатель, Расширение, Значение, Строка(Индекс ))
Индекс = Индекс + 1
Нашел я к нему исходники тестового приложения, собрал, проверил - работает. Оттуда и взял данные для intent-фильтра.
Естественно, в поле штрихкода возвращается пустая строка, т. к. компонента не обрабатывает массив. Другие параметры (тип ШК, длина - возвращаются корректно). Добавил в BroadcastEvent.java в методе "onReceive" условие и вписал туда код из тестового приложения ("barocode" - не опечатка):
for (Map.Entry<String, String> entry : StringExtraList.entrySet())
{
// ----------------------------------------
String Value = "";
if (entry.getKey() == "barocode")
{
byte[] barocode = intent.getByteArrayExtra("barocode");
int barocodelen = intent.getIntExtra("length", 0);
Value = new String(barocode, 0, barocodelen);
}
else
{
Value = intent.getStringExtra(entry.getKey());
}
// -------------------------------------------
//String Value = intent.getStringExtra(entry.getKey());
AnsverJson.put(GetNameExt(entry.getKey()),(Value == null) ? entry.getValue() : Value);
}
ПоказатьСобрал apk, архив с компонентой, обновил макет в конфигурации. Результат - та же пустая строка в "barocode"... Думаю, может ошибка где - написал просто для проверки:
if (entry.getKey() == "test")
{
Value = "test msg";
}
В 1С добавил экстра:
глНативКомпонента.AddStringExtra(ЭвентУказатель,"test", "", "Это тест");
все пересобрал, обновил - результат: {"Это тест":"","Тип штрихкода":0,"Длина":13}, не возвращается "test msg"...
Такое впечатление, что компонента где-то закешировалась и при обновлении конфигурации просто работает Ваш вариант, а не то что собрал я. Я что-то упустил или чего-то не знаю? Подскажите, пожалуйста!
barocode похоже байтовый массив, вот пример onReceive из другой компоненты:
public void onReceive(Context context, Intent intent) {
byte[] barcode = intent.getByteArrayExtra("barocode");
int lng = intent.getIntExtra("length", 0);
this.barcodeStr = new String(barcode, 0, lng);
if (lng > 0) {
Intent intentFor1C = new Intent("com.google.android.c2dm.intent.RECEIVE");
intentFor1C.putExtra("text", BCService.EventID);
intentFor1C.putExtra("title", "1C");
intentFor1C.putExtra("data", this.barcodeStr);
if (BCService.BaseName != null || BCService.BaseName != "") {
intentFor1C.putExtra("base", BCService.BaseName);
}
context.sendBroadcast(intentFor1C);
}
} Показатькомпоненты пока не собирал, помогите чтобы работало!
1. Во первых условие if (entry.getKey() == "barocode") когда должно - не выполняется, Когда entry.getKey() это barocode, оно почему-то не равно "barocode"
2. Если убрать условие if (entry.getKey() == "barocode") остальной код полностью рабочий.
3. Чтобы победить кеширование, нужно делать все в правильной последовательности: 1. Удалить базу в мобильном приложении. 2. Обновить компоненту в макете. 3. Переопубликовать/обновить на http сервере. 4. Пересоздать в мобильном, запустить, вуаля работает.
Мистика какая-то... А как тогда переписать условие if (entry.getKey() == "barocode")? Может как-то проверять что возвращается в intent.getByteArrayExtra("barocode")?
Нужно просто посмотреть в отладчике значение, возможно оно имеет тип не строка, а когда используешь его как строка, оно автоматом в нее превращается, как обычно это бывает в 1с. Я отладчиком не научился еще работать, не было времени
Я тоже не умею, времени не хватает сейчас андроид осваивать... Придется, видимо)
Проблема какая-то со сборкой, наверное. Уже вообще все закомментировал в обработчике onReceive, собрал apk - события ловятся...
Прикрепил еще архив с проектом TestScan, который для ТСД. Собрал его, только дописал чтобы вместо штрихкода он выводил в текстовое поле список всех Extras (intent.getExtras().toString()). Выдал при считывании EAN-13 такое:
Bundle[{barocode=[B*d074b1c,length=13,aimid=[B*8a5b325,barcodeType=100}]То есть китайские гении действительно назвали поле "barocode" :)
BroadcastEvent.java
[B*8a5b325 - тип + адрес - тип Byte Адресс 0x000008a5b325
Возможно проблема с кодировкой
Используй конструктор:
String(byte[] bytes, int offset, int length, String charsetName)
Constructs a new String by decoding the specified subarray of bytes using the specified charset.
barcodeStr = new String(barocode, 0, barocodelen,"UTF_16"); // как то так нет под рукой студии.
charsetName - Тип скорей всего это UTF_16 или какойнибуть ISO_8859_1
Проверь реальную длину:
barocode.length()
Символов может быть 13 а байт 13*2 = 26 тогда barocodelen*2
Так в их тестовом приложении работает...
Попробую создать с нуля конфигурацию, собрать компоненту, и подключить к ней. Ну не может быть, что собираю один код, а работает другой...
В их тестовом приложении может быть настроена кодировка по умолчанию UTF -16 (настройка проекта)
Вы в отладке посмотрите в андроид студия запустите мой app.
В модуле AddInNative.cpp найдите код:
//---------------------------------------------------------------------------//
//Отладка java
//---------------------------------------------------------------------------//
jlong CreateEventByJava(JNIEnv* env,jobject jClass, TAddInNative* pObject, int KeyTest)
{
Вызывается при нажатии на кнопку в MainAPP
Там много кода закоментировано . Это я отлаживал непосредственно в App Андроид
И события можно поймать в модуле BroadcastEvent.java и посмотреть что за байты приходят имено в мое АПП
Выполняю:
// Создаем BROADCAST для считывателя клавиш событие выдает AccessibilityService
ЭвентУказатель = глНативКомпонента.CreateBroadcast("ru.mal.malutilities.onKeyEvent.1");
глНативКомпонента.AddStringExtra(ЭвентУказатель,"Code",-256,"Код");
глНативКомпонента.AddStringExtra(ЭвентУказатель,"Action",-256);
глНативКомпонента.AddStringExtra(ЭвентУказатель,"Flags",-256);
глНативКомпонента.Listen(ЭвентУказатель);
но не возникает Внешнее событие при нажатии аппаратных кнопок. При считывании ШК возникает, всё норм.
Что делаю не так?
Что из себя данный код представляет? А главный вопрос, если разные ТСД (в том числе и модели), коды будут отличаться?
Победил, переписал onReceive, чтобы возвращал просто строку со штрихкодом. Теперь другая проблема)
В мобильной платформе для разработчиков компонента работает, а в собранном apk - нет, ошибка "Тип не определен AddIn.rumalutilities.MALutilities". Собирал на 8.3.15.62
Куда копать, подскажите, пожалуйста!
Нет, вы не поняли. Все работает (у меня apache) нормально - когда загружена опубликованная конфигурация в мобильную платформу для разработчиков.
Не подключается та же компонента в уже собранном apk, соответственно имеем ошибку "Тип не определен AddIn.rumalutilities.MALutilities" при вызове конструктора
// Создаем 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(ЭвентУказатель);
ПоказатьКнопки отрабатывает только физические.
Сервис нужно устанавливать, как apk, а запускать в Настройки-Спец. возможности. При запуске он спрашивает разрешения на перехват клавиатуры.
скаченыйархив\malaccservice\package\ru_mal_accessibilityserv
Какая версия Андроид?
А сканирование не будет отлавливаться (это не разрыв клавиатуры). Кнопки отрабатывает только физические. Сканирование через "Broadcast". Или через буфер обмена. Что за терминал?
Просто 1с не умеет работать с физическими кнопками если нет фокуса ввода к элементу. Для этого и написан сервис.
К сожалению нет этого аппарата под рукой .
1. Попробуйте поиграть с настройками.
2. Очистить в намерениях категорию "Intent->Category"
3. Попробуйте проверить идет ли броадкаст от сканера, каким то другим приложением например
4. Запустить отладку в Android studio.
5. Попробовать настроить через Clipboard.
6. спросить у пользователя "booblich" чем все закончилось у него.
При запуске на UROVO i6200A Android 5.1.1, ошибки про файл не выдаёт, но метод ПодключитьВнешнююКомпоненту возвращает Ложь.
Добавить в manifest name="libru_mal_utilities"
примерно так.
<?xml version="1.0" encoding="UTF-8"?>
<bundle name="ru_mal_utilities" xmlns="http://v8.1c.ru/8.2/addin/bundle">
<component arch="ARM" type="native" codeType="c++" path="libru_mal_utilities.so" os="Android" name="libru_mal_utilities"/>
<component arch="ARM" type="native" codeType="java" path="ru_mal_utilities.apk" os="Android" name="libru_mal_utilities"/>
</bundle> ПоказатьПотом удалите и добавти базу
Александр, подскажите - в BroadcastEvent.java добавил свою функцию, которую хочу вызывать из TAddInNative::CallAsProc, например по аналогии как Вы это делаете через указатель возвращаемый GetBroadcastEvent.
TBroadcastEvent* cBroadcastEvent = GetBroadcastEvent(paParams->pwstrVal);
if(cBroadcastEvent){
cBroadcastEvent->Send();
return true;
}
Но мне не нужно ничего искать, а просто ее вызвать. Подскажите как лучше это сделать ?
На Android 4.4.2 сервис не ставится (видимо, устаревшая версия системы для сервиса)
.so
.apk
Тип MIME: application/octet-stream/.
Пересоберите проекты(во вложении) под вашу версию Андр
Такая же ерунда, не подключается внешняя компонента.
Устройство Атол Smart.Lite.
Установил ваш сервис, для отлавливания нажатия клавиш. Но по бродкастам приходит пустое сообщение:
<?xml version="1.0" encoding="UTF-8"?>
<MessageData>
<FilterName>ru.mal.malutilities.onKeyEvent.1</FilterName>
<FilterData name="Code"
datatype="6"/>
<FilterData name="Flags"
datatype="6"/>
</MessageData>
В чем может быть причина?
Может быть связано с тем, что апк собрано платформой, без изменений в permission?
Добрый день.
Что значит пустое сообщение (пустая строка или что - уточните)?
Настройку сервиса делали по средствам броудкастов (ru.mal.accessibilityservice.CONFIG_SERVICE.1)?
// Создаем BROADCAST для AccessibilityService настраиваем его
СтруктураДанных = ОбщийМодульКлиент.СоздатьСтруктуруИзAndroid(Данные);
ЭвентУказатель = глНативКомпонента.CreateBroadcast("ru.mal.accessibilityservice.CONFIG_SERVICE.1", "ТестСервер");
глНативКомпонента.AddStringExtra(ЭвентУказатель, "ACTION_TYPE", 0); // только нажатие там еще 3 события нужно читать в андройде
глНативКомпонента.Send(ЭвентУказатель);
глНативКомпонента.AddStringExtra(ЭвентУказатель, "FLAGS", Истина); // передача флага. кокой нужно исходники смотреть
глНативКомпонента.Send(ЭвентУказатель);
глНативКомпонента.DeleteBroadcastEvent(ЭвентУказатель); ПоказатьЗначит, что сообщение приходит, когда подписываюсь именно на "onKeyEvent.1". Но значений в сообщении нет. В предыдущем моем комментарии сообщение показывал.
Пробовал и так, как вы написали, и вообще весь код из статьи - нет оповещений.Внешнее событие не срабатывает по "ru.mal.accessibilityservice.CONFIG_SERVICE.1".
В исходнике (там кода 4 строчки) используется класс KeyEvent и функция getKeyCode() можно погуглить почему она возвращает ноль.
Попробуйте настроить ru.mal.accessibilityservice.CONFIG_SERVICE.1 - "ACTION_TYPE" = 1.
Попробуйте пересобрать сервис под ваш андроид.
Специально попробовал собрать на релизе мобильного приложения 8.3.16 , но не помогло, единственно осталось проверить на 10-ке андроид apk на старом релизе 1С.
Текст из манифеста:
<?xml version="1.0" encoding="UTF-8"?>
<bundle name="ru_mal_utilities" xmlns="http://v8.1c.ru/8.2/addin/bundle">
<component arch="ARM" type="native" codeType="c++" path="libru_mal_utilities.so" os="Android" name="libru_mal_utilities"/>
<component arch="ARM" type="native" codeType="java" path="ru_mal_utilities.apk" os="Android" name="libru_mal_utilities"/>
</bundle>
Показать
наверно нужно на ARM64 пересобрать
На 32
Текст из манифеста:
<?xml version="1.0" encoding="UTF-8"?>
<bundle name="ru_mal_utilities" xmlns="http://v8.1c.ru/8.2/addin/bundle">
<component arch="ARM" type="native" codeType="c++" path="libru_mal_utilities.so" os="Android" name="libru_mal_utilities"/>
<component arch="ARM" type="native" codeType="java" path="ru_mal_utilities.apk" os="Android" name="libru_mal_utilities"/>
</bundle>
Показатьнаверно нужно на ARM64 пересобрать или не арм вобще
Процедура ПриНачалеРаботыСистемы() Экспорт
Результат = Новый Структура("Выполнено,Ошибка", Ложь,"");
Если ПодключитьОбработчикСобытийТСД(Результат) Тогда
Иначе
Попытка
УстановитьВнешнююКомпоненту("ОбщийМакет.итсAtolSmartLife");
Если ПодключитьОбработчикСобытийТСД(Результат) Тогда
КонецЕсли;
Исключение
КонецПопытки;
Конецесли;
Если Результат.Выполнено Тогда
итсОбработкаСобытийСервер.итсСообщить("Начать!!!");
Иначе
итсОбработкаСобытийСервер.итсСообщить(Результат.Ошибка);
КонецЕсли;
КонецПроцедуры
Функция ПодключитьОбработчикСобытийТСД(ДанныеРезультата) Экспорт
Если ДанныеРезультата = Неопределено ТОгда
ДанныеРезультата = Новый Структура("Выполнено,Ошибка", Ложь,"");
КонецЕсли;
Попытка
Если ПодключитьВнешнююКомпоненту("ОбщийМакет.итсAtolSmartLife", "rumalutilities", ТипВнешнейКомпоненты.Native) Тогда
глСобытияAndroid = Новый("AddIn.rumalutilities.MALutilities");
ДанныеРезультата.Выполнено = Истина;
Возврат Истина;
Иначе
ДанныеРезультата.Выполнено = Ложь;
ДанныеРезультата.Ошибка = "Драйвер не установлен!";
Возврат Ложь;
КонецЕсли;
Исключение
глСобытияAndroid = Неопределено;
ДанныеРезультата.Выполнено = Ложь;
ДанныеРезультата.Ошибка = ОписаниеОшибки();
КонецПопытки;
ДанныеРезультата.Выполнено = Ложь;
Возврат Ложь;
КонецФункции ПоказатьПример из справки 1с.
&НаКлиенте
Процедура Команда(Команда)
Подключить(Истина);
КонецПроцедуры
&НаКлиенте
Процедура Подключить(УстановитьЕслиНеПодключено) Экспорт
НачатьПодключениеВнешнейКомпоненты(
Новый ОписаниеОповещения(
"ПослеПодключения",
ЭтотОбъект,
УстановитьЕслиНеПодключено),
"ОбщийМакет.ВнешняяКомпонента",
"ВнешняяКомпонента");
КонецПроцедуры
&НаКлиенте
Процедура ПослеПодключения(Подключено, УстановитьЕслиНеПодключено) Экспорт
Если Подключено Тогда
// Внешняя компонента подключена
ИначеЕсли УстановитьЕслиНеПодключено Тогда
НачатьУстановкуВнешнейКомпоненты(
Новый ОписаниеОповещения(
"Подключить",
ЭтотОбъект,
Ложь),
"ОбщийМакет.ВнешняяКомпонента");
Иначе
// Не удалось установить или подключить
// внешнюю компоненту
КонецЕсли;
КонецПроцедуры
ПоказатьА по ошибке. Да просто так и пишет "Ошибка внешней компоненты" и всё. на строке:
глНативКомпонента.AddStringExtra(ЭвентУказатель,"Code",-256,"Код");
Скиньте фотку ошибки.
Этот код ?:
ЭвентУказатель = глНативКомпонента.CreateBroadcast("ru.mal.malutilities.onKeyEvent.1");
глНативКомпонента.AddStringExtra(ЭвентУказатель,"Code",-256,"Код");
Если да, нужно чтоб был установлен и запущен сервис (ru.mal.malutilities.onKeyEvent.1). из папки сервис.
Сервис который перехватывает нажатие кнопок.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1224310
Создание 15.04.20 13:20
Обновление 04.12.25 13:49
Просмотры 26398
Загрузки 144
Рейтинг
24
Комментарии 130
Код открыт Да
Рубрики Сканер штрих-кода Разработка внешних компонент
Кому Разработчик
Тип файла Архив с данными
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Android
Страна Не имеет значения
Отрасль Оптовая торговля, дистрибуция, логистика
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)