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


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

Широковещательные оповещения

Продолжение статьи автора о внешних компонентах для мобильных приложений, в которой представлен развернутый пример компоненты получения широковещательных оповещений в андроиде (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 булево
17

массив типов булево

18

неподдерживаемый тип данных

19

Пустые данные (null)

(Типы последних двух строк могут возвращаться, если параметр CaptureData не задан, об этом режиме работы см. ниже).

Для массивов типов байт или символ параметр 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. Удалить или изменить этот набор после установки невозможно, для этого необходимо пересоздать объект компоненты.

Параметр "Category" позволяет добавить к намерению отбор по категориям. Его также можно устанавливать перед стартом отслеживания броадкастов несколько раз, если требуется отбор по нескольким категориям. Очистка набора категорий возможна только при пересоздании объекта компоненты.

После включения компонента, как и любое устройство ввода, возвращает данные через внешнее событие 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>.

Начиная с релиза 1.1.4 компонента поддерживает автоматическое определение всех возможных фильтров и возвращаемых типов данных. Чтобы включить такой режим, необходимо оставить параметр CaptureData пустым. При возникновении события xml тэг MessageData не будет возвращать значений, но будет включать числовой атрибут datatype в соответствии с приведенной выше таблицей. Если событие будет иметь данные с пустым значением, тип которого невозможно определить, атрибут будет равен 19. Сложным типам, необрабатываемым компонентой, будет присвоен индекс 18.

<?xml version="1.0" encoding="utf-8"?>
<MessageData>
<FilterName>Имя оповещения, заданного параметром FilterName</FilterName>
<FilterData name="имя очередного параметра CaptureData" datatype="число - индекс типа из таблицы"/>
<!-- любое число тэгов FilterData -->
</MessageData>

Приведем пример xml, возвращаемого батареей (android.intent.action.BATTERY_CHANGED) в режиме определения фильтров:

Пользователи могут использовать конфигурацию из статьи для определения значений фильтров любых событий, если вручную отредактируют имя намерения и вызовут событие.

Буфер обмена

В версии 1.1 компоненты добавлена работа с буфером обмена Андроида (clipboard). Буфер позволяет выполнять операции вставки и извлечения (Copy/Paste) и может содержать данные типов текст, гиперссылка и намерение. Свойство СодержимоеБуфера возвращает их в текстовом представлении. Метод УстановитьСодержимое передает в буфер любой текст. Компонента также в состоянии передать в 1С оповещение об изменении буфера любой программой или службой.

Подключение объекта буфера:

КомпонентаБуфер = Новый("AddIn.Broadcasts.Clipboard");

Объект Clipboard тоже реализован по стандарту устройства ввода. Соответственно, имеет методы Подключить и Отключить. После подключения компонента передает в 1С внешнее событие с именем ClipboardEvent при изменении содержимого буфера. Третий параметр внешнего события содержит текстовое представление данных или пустой, если буфер очищен. Независимо от подключения, разработчик может использовать свойство компоненты СодержимоеБуфера (ClipboardContent) доступное только для чтения, которое возвращает содержимое буфера обмена и метод УстановитьСодержимое (SetContent) с двумя параметрами (данные и метка — строки) для его модификации.

Примечание: Если компонента буфера подключена методом Подключить, помещение данных через УстановитьСодержимое породит внешнее событие ClipboardEvent, неотличимое от любого другого изменения. Нужно либо отключать компоненту перед изменением буфера либо фильтровать такие события по данным, если стоит задача их проигнорировать.

О примере

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

Конфигурация и внешняя компонента предназначены для работы с релизом мобильной платформы не ниже 8.3.15.59.  Допускается также работа с релизами, начиная с 13-го, но для этого необходимо вручную отредактировать манифест компоненты в архиве и удалить поддержку 64-битный платформ.

99 Comments

  1. saa@kuzov.org

    Спасибо!

    А исходники этой ВК можно увидеть?

    Reply
  2. greyhedgehog

    Игорь, спасибо! Очень помогла компонента для работы со встроенным сканером в ТСД Honeywell EDA50K.

    Reply
  3. greyhedgehog

    Поторопился похвалить. На мобильной платформе 8.3.11.61 на указанном выше устройстве (Android 4.4.4) после подключения компоненты (именно после нажатия кнопки «Старт» в форме) даже на чистом примере с определением состояния батареи непредсказуемо начинает жутко тормозить интерфейс или вообще «падает» приложение в течение нескольких десятков секунд. До подключения все работает. Не подскажете, возможно ли это исправить? Очень нужна стабильная работа на устройстве.

    Спасибо.

    Reply
  4. IgorKissil

    Проверил на указанной платформе и 8-м андроиде — все ОК. Проверить на 4-м сейчас не могу. Но вполне допускаю, что могут быть проблемы. Я до сих пор держу два сборщика мобильных приложений под рукой, один «свежий», другой с платформой 8.3.9, ибо ТСД у одного клиента с 4м андроидом работают только с этой платформой.

    Reply
  5. greyhedgehog

    (4) Спасибо. Да, похоже дело в версии Андроида, на телефоне с 6-м работает, а на телефоне с 4-м такое же поведение. К сожалению ТСД на 4-м и ее не обновить, попробую с платформой 8.3.9 поэкспериментировать.

    Reply
  6. IgorKissil

    попробуйте собрать под sdk ниже 25

    Reply
  7. IgorKissil

    (5) Проверил на эмуляторе 4-го андроида — пример к статье работает. Увы, физических устройств с этой версией у меня нет. На терминале с 5-м адроидом тоже все в порядке.

    Reply
  8. IgorKissil

    (5) Обновил пример для новой мобильной платформы

    Reply
  9. greyhedgehog

    Спасибо. Обновленная версия примера работает стабильно, по крайней мере на имеющемся у меня телефоне с Android 5.0.1 и на ТСД с Android 7.1.1 проблем больше нет. На ТСД перенастроил компоненту на событие от сканера штрихкода, ШК перехватываются замечательно. Специально проверил на предмет описанных в некоторых статьях пропусков при сканировании ШК, у меня на ТСД не получилось заставить пример пропускать сканирования, даже при очень интенсивной работе, при последовательном сканировании нескольких ШК, все работало.

    Reply
  10. s.neumyvakin_2015

    (2)Добрый день! Напиши пожалуйста как ты настраивал компоненту. Четвертый день ума не могу дать ТСД Honeywell EDA50K

    Reply
  11. greyhedgehog

    (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);

    Reply
  12. rem2222

    Добрый день, помогите пожалуйста. Установил на ТСД с андроид 4.4, интент ловит и батарейки и сканШК, но данных в них нет. Что можно с этим сделать? Прилагаю скан на Андр8 и на 4.4

    Reply
  13. hobi

    Отличная компонента, на Honeywell EDA50 работает без проблем !

    Reply
  14. IgorKissil

    В версии 1.0.2 исправлена ошибка в компоненте, которая в редких случаях может вызвать утечку памяти

    Reply
  15. hobi

    Странное поведение компоненты.

    Связь ТСД с компьютером через кабель (ADB.exe, Интернет тоже через кабель)

    Сценарий 1:

    Добавляю на мобильной платформе мобильное приложение, оно загружается на ТСД, сразу вхожу

    пользовательский режим.

    ПодключитьВнешнююКомпоненту(«ОбщийМакет.Component», «Broadcasts», ТипВнешнейКомпоненты.Native)

    отрабатывает успешно и впоследствии работает в этом приложении.

    Сценарий 2:

    После загрузки мобильного приложения на ТСД отключаю кабель, затем вхожу в пользовательский

    режим.

    ПодключитьВнешнююКомпоненту(«ОбщийМакет.Component», «Broadcasts», ТипВнешнейКомпоненты.Native)

    не отрабатывает ! И впоследствии не запускается.

    Сценарии 1 и 2 запускал несколько раз, поведение не меняется, именно такое, как описано.

    Такое ощущение, что при первом подключении компонента обращается к внешнему интернет-ресурсу

    и начинает затем работать, только если этот ресурс был доступен.

    Если доступ к сети интернет перекрыт службой безопасности, то использовать компоненту проблематично (

    Reply
  16. hobi

    (15)

    Странное поведение компоненты

    Такое поведение наблюдается и в собственном приложении и в приложении, загруженном из конфигурации broadcast.cf, размещенной в публикации.

    Reply
  17. IgorKissil

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

    Reply
  18. hobi

    (17) Спасибо за ответ. Буду с нюансами бороться.

    Reply
  19. NecroJew

    Добрый день!

    Пробовал установить демонстрационное приложение на два устройства (в обоих случаях мобильная платформа 8.3.12.64, согласно вашей рекомендации):

    1. ТСД Urovo V5100, Android 4.3

    2. Чистый телефон Nexus 5, голый андроид 6.0.1

    При выполнении команды Компонента.Подключить() приложение вылетает. На Андроиде 4.3 без отображения информации об ошибке, в 6.0.1 выдает следующий текст:

    java.lang.NullPointerException: Attempt to invoke virtual method ‘android.content.Intent android.content.Intent.addFlags(int)’ on a null object reference

    at com.iksoftware.unimes.BroadcastMessage$2.run(BroadcastMessage.java:283)

    at android.os.Handler.handleCallback(Handler.java:739)

    at android.os.Handler.dispatchMessage(Handler.java:95)

    at android.os.Looper.loop(Looper.java:148)

    at android.app.ActivityThread.main(ActivityThread.java:5417)

    at java.lang.reflect.Method.invoke(Native Method)

    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)

    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

    Не подскажете, в чем может быть проблема?

    Спасибо.

    Reply
  20. s.neumyvakin_2015

    (19) Добрый день!

    У меня на ТСД Honeywell тоже самое, хотя на прошлой версии компоненты все работало.

    Reply
  21. IgorKissil

    (19) (20) Попробуйте эту версию компоненты, если она рабочая, обновлю пример в статье: https://1drv.ms/u/s!AnW7yKDG1JDfh8J5DM1-VL_mHAdDqg

    Reply
  22. s.neumyvakin_2015

    (21) Добрый день!

    К сожалению ошибка осталась:

    java.lang.NullPointerException: Attempt to invoke virtual method ‘android.content.Intent android.content.Intent.addFlags(int)’ on a null object reference

    at com.iksoftware.unimes.BroadcastMessage$2.run(BroadcastMessage.java:283)

    at android.os.Handler.handleCallback(Handler.java:751)

    at android.os.Handler.dispatchMessage(Handler.java:95)

    at android.os.Looper.loop(Looper.java:154)

    at android.app.ActivityThread.main(ActivityThread.java:6130)

    at java.lang.reflect.Method.invoke(Native Method)

    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)

    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

    Reply
  23. IgorKissil

    Тогда все сложнее. Я ошибку воспроизвести не могу, на доступных мне устройствах все работает. В моем коде даже нет такого места Intent.addFlags(int). Максимум что могу, это позже попробовать на эмуляторе nexusa.

    Reply
  24. hobi

    Результат в виде XML-строки — это здорово.

    Но недавно наткнулся на проблему обработки XML-строки платформой 1С.

    Вот XML, полученный при считывании штрихового кода на образце упаковки сигарет:

    <?xml version=»1.0″ encoding=»UTF-8″?><MessageData><FilterName>com.android.server.scannerservice.broadcast</FilterName><FilterData name=»m3scannerdata»>010460026601181721″Nv>vM-91ffd0929ysTNw==24010053940</FilterData><FilterData name=»m3scanner_code_type»>DataMatrix</FilterData></MessageData>

    В этом примере кода последовательность символов & # 2 9 ; при вставке кода в данном сообщении автоматически была заменена на собственно сам спецсимвол. Внешняя компонента возвращает именно представление спецсимвола & # 2 9 ; ( без пробелов, если пробелы убрать, получится  )

    Код

     ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ТекстXML);
    Пока ЧтениеXML.Прочитать() Цикл
    …
    

    выбрасывает исключение. Спецсимвол с кодом 29 (представление

    & # 2 9 ;

    ) платформой не обрабатывается.

    Приходится вставлять «костыль» СтрЗаменить перед УстановитьСтроку.

    Это просто константация факта, особенности обработки XML-представления данных, возвращаемых компонентой.

    Reply
  25. hobi

    Вопрос к Автору:

    В связи с тем, что в составе данных широковещательного сообщения

    может быть строка, содержащая символы, не обрабатываемые

    платформой 1С (символ с кодом 29) в том случае, если строка

    размещена в XML-формате, можно ли доработать компоненту

    следующим образом:

    — добавить параметр с типом булево: HexСтрокиВXML или Base64СтрокиВXML.

    Чтобы при установке параметра в значение «Истина», компонента

    возвращала в XML, в котором строчные значения преобразованы

    в Hex или Base64.

    Такая доработка позволила бы обойти текущую ошибку платформы 1С —

    исключение при вызове ЧтениеXML.Прочитать() , если для ЧтениеXML

    установлена строка, содержащая последовательность символов & # 2 9 ;

    И, кроме того, для остальных символов с кодом, меньшим 32

    (например символ «>») не придется обрабатывать значения строчных полей

    СтрЗаменить(Поле, «& g t ;», «>»). Лучше уж один раз обработать и преобразовать

    из Hex или Base64 в оригинальную строку.

    ?

    Для иллюстрации проблемы — изображение этикетки на блоке сигарет.

    Обработка строки XML, возвращаемой компонентой при чтении

    кода DataMatrix с этикетки, вызывает исключение в платформе 1С

    ( ЧтениеXML.Прочитать() )

    Reply
  26. IgorKissil

    (25) Можно. По срокам пока ничего не скажу

    Reply
  27. PaulSharkoff

    Игорь, спасибо. Компонента отлично завелась на Zebra MC3300 (Andriod 7) на мобильном клиенте 8.3.12 для перехвата сообщений от DataWedge

    Reply
  28. SergeyPodolniy

    Добрый день!

    Пытаюсь настроить компоненту на ТСД Zebra MC36, Android 4.4. Данные с батареи ловит, а со сканера — нет. Имя события в 1С прописал такое же, как в настройках сканера. Может ли проблема заключаться в том, что я неверное имя данных указываю в CaptureData? В документации к ТСД этой информации нет, разные варианты перепробовал и пока ничего не получается.

    Reply
  29. SergeyPodolniy

    (28) Нашел причину. Оказалось, что intent формируется с определенной категорией и чтобы его отловить нужно в фильтре эту категорию явно указать. Вопрос к автору, можно ли добавить в настройки компоненты параметр «FilterCategory» по аналогии с «FilterName»?

    Reply
  30. IgorKissil

    (29) В релиз 1.0.4 добавил параметр Category

    Reply
  31. Гость

    Спасибо большое!

    Reply
  32. SenFeron

    Добрый день.

    После запуска приложения. Выдается сообщения «Компонента не подключена».

    Подскажите пожалуйста, кто то встречался с данной проблемой?

    Может кто подсказать как запустить компоненту?

    ТСД Honeywell EDA50K

    Android 7.1.1

    Платформа 8.3.12.67

    Пробовал сначала все выполнить по комментарию greyhedgehog (номер комментария — 11)

    Потом поставил оригинальный из темы Cf , проблема осталась.

    Reply
  33. user1024947

    Добрый день

    Подскажите пожалуйста что сделать.

    Наше оборудование Терминал сбора данных: Zebra TC-20 android ver 7.1

    В обработчике по открытии

    Добавлено

    barcode = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,»data»,XMLСтрока(Ложь),XMLСтрока(0));

    Компонента.УстановитьПараметр(«CaptureData»,barcode);

    При сканирование ШК в обработчике «Внешнее событие» в переменную данные возвращается XML строка которая не содержит Штрих код

    Reply
  34. user1024947

    (27)Добрый день

    Помогите разобраться у нас оборудование почти как у Вас:

    сбора данных: Zebra TC-20 на 7 андроиде

    При сканирование ШК в обработчике «Внешнее событие» в переменную данные возвращается XML строка которая не содержит Штрих код

    В обработчике при открытии barcode = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,»data»,XMLСтрока(Ложь),XMLСтрока(8));

    Компонента.УстановитьПараметр(«CaptureData»,barcode);

    Reply
  35. menen

    Здравствуйте!

    Игорь, пытаемся опубликовать скаченную конфигурацию (платформа 8.3.12.1685 32x в 64 WinОС) для проверки на ТСД — не получается — выдается ошибка следующего содержания:

    «Ошибка разбора манифеста внешней компоненты Component: отсутствует обязательный атрибут name»

    В чем может быть проблема?

    Reply
  36. IgorKissil

    (35) Я думаю, Вы пытаетесь собрать приложение на Windows 64? Взял cf из статьи и пересобрал сборщиком в Win10 64bit — все ОК.

    Reply
  37. IgorKissil

    (35) Как Вы ее пытаетесь публиковать? На http сервере? Разобраться как это делать для приложений с компонентами у меня не хватило времени/терпения. Я все делаю через adb install

    Reply
  38. menen

    Из конфигуратора — Публикация мобильного приложения — на Веб-сервере (Apache 2.2)

    Reply
  39. menen

    (37) Игорь, пока планировали работать на мобильной платформе без сборки

    Reply
  40. menen

    (39) даже при записи конфигурации мобильного приложения в файл (для сборщика) выходит это сообщение

    Reply
  41. menen

    (36) Платформа 1С 8.3.12 развернута на ноуте 64 Windows 7. Это как-то влияет?

    Reply
  42. menen

    (41) Развернул 1С на Win10 ошибка ушла.

    Однако как и у (32) — компонента на ТСД НЕ подключается.

    ТСД PL-40L (Caribe)

    Android 7.0

    Платформа 8.3.12.67

    Reply
  43. menen

    (32) Вопрос не решили? Также не подключается ни на ТСД (PL-40 Android 7), ни на планшете (Huawei Andr 7) …

    Reply
  44. Rokstedi

    Не срабатывает внешнее событие, хотя компонента подключается. Подскажите, приложение обязательно нужно собирать или можно опубликовать и подключиться с мобильной платформы?

    Reply
  45. Rokstedi

    (44)Все разобрался. Собрал приложение, заменил по инструкции интент фильтр и сообщения начали приходить.

    Reply
  46. user708791_ared2000

    (34) Вам удалось разобраться? У меня Zebra MC40. Тоже событие ловит, а данные пустые. Может поле должно не «data» называться?

    Reply
  47. user708791_ared2000

    (29)А какая категория по умолчанию формируется? Или вы в Datawedge категорию указали? У меня тоже событие ловится, а данные не передаются.

    Reply
  48. user1024947

    (46) Да, удалось. Имя переменной для баркода «com.symbol.datawedge.data_string» , для типа баркода «com.symbol.datawedge.label_type».

    Reply
  49. user708791_ared2000

    Здравствуйте! ТСД Motorola MC40 на андоиде 5.1.1. На нем работа идет через Datawedge. Событие ловится, но в данные ничего не возвращает. А для батарейки все норм передает. Может ему имя поля «data» не подходит для этого ТСД? Подскажите в чем может быть причина.

    Reply
  50. user708791_ared2000

    (48) Ну ничего себе имя… Заработало! Спасибо огромное!

    Reply
  51. user708791_ared2000

    (49) Разобрался с помощью(46)

    Да, удалось. Имя переменной для баркода «com.symbol.datawedge.data_string» , для типа баркода «com.symbol.datawedge.label_type».
    Reply
  52. hobi

    Добрый день.

    На платформе 1С:Предприятие 8.3.12.1685 перестала работать загрузка мобильного приложения через сервер.

    Сообщение при попытке публикации мобильного приложения.

    Ошибка разбора манифеста внешней компоненты Component: отсутствует обязательный атрибут

    name

    На предыдущих версиях 8.3.12 публикация завершается нормально.

    Reply
  53. user708791_ared2000

    (52)Это наверное не через сервер, а если в конфигураторе по пути Конфигурация/Мобильноеприложение/Опубликовать . У меня тоже такая ошибка в этом случае. Но на web-сервере все публикуется без ошибок

    Reply
  54. hobi

    Манифест изменил, всё заработало.

    Reply
  55. kosten

    (54) Здравствуйте. Подскажите что необходимо изменить в манифесте, чтобы исправить ошибку «Ошибка разбора манифеста внешней компоненты Component: отсутствует обязательный атрибут name»?

    Reply
  56. hobi

    Это вариант у меня заработал:

    <?xml version=»1.0″ encoding=»UTF-8″?>
    <bundle xmlns=»http://v8.1c.ru/8.2/addin/bundle» name=»com_iksoftware_unimes»>
    <component os=»Android» path=»libcom_iksoftware_unimes_ARM.so» codeType=»c++» type=»native» arch=»ARM» name=»com_iksoftware_unimes»/>
    <component os=»Android» path=»unimes.apk» codeType=»java» type=»native» arch=»ARM» name=»com_iksoftware_unimes»/>
    <component os=»Android» path=»libcom_iksoftware_unimes_x86.so» codeType=»c++» type=»native» arch=»i386″ name=»com_iksoftware_unimes»/>
    <component os=»Android» path=»unimes.apk» codeType=»java» type=»native» arch=»i386″ name=»com_iksoftware_unimes»/>
    </bundle>
    
    Reply
  57. adt

    (50) Добрый день, такая же проблема — подскажите, где и как задать имя переменной для для баркода и для типа баркода, никак не могу сообразить.

    Reply
  58. adt

    Здравствуйте.

    ТСД symbol mc32n0, Андроид 4.1.1

    события приходят, но доп поля, указанные в параметрах CaptureData — в XML отсутствуют.

    Тот же пример прогнал на телефоне с Андроид 5.1 — все пришло с параметрами.

    Получается, что дело в версии андроида? У кого-нибудь заработало на 4.1.1?

    Reply
  59. IgorKissil

    (58) Думаю это потому что компонента собрана для андроида начиная с 19й версии (4.4). Будет время сделаю ребилд с 16-й.

    Reply
  60. Xershi

    Добрый день!

    Подскажите материалы как самому написать компоненту для андроида?

    Вот в этой теме изучаю вопрос:

    https://forum.infostart.ru/forum15/topic202825/

    Reply
  61. user708791_ared2000

    (57) В обработчике при открытии barcode = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,»data»,XMLСтрока(Ложь),XMLСтрока(8));

    Компонента.УстановитьПараметр(«CaptureData»,barcode);

    Вот здесь вместо «data» нужно написать то самое длинное имя «com.symbol.datawedge.data_string». Если нужен еще тип кода, то нужно установить еще один параметр и вместо «data» указать «com.symbol.datawedge.label_type».

    Reply
  62. АлександрЯрославичъ

    (35)

    Платформа 8.3.12.1685

    «Ошибка разбора манифеста внешней компоненты бла-бла…»

    Такая ошибка вываливается почти на каждой компоненте.

    В проблемных манифестах добавлял атрибут

    <?xml version=»1.0″ encoding=»UTF-8″?>
    <bundle xmlns=»http://v8.1c.ru/8.2/addin/bundle» name=»com_1c_MobileBarcodeScanner»>
    <component os=»Android» path=»libcom_1c_MobileBarcodeScanner_i386_1_0_3_2.so» codeType=»c++» type=»native» arch=»i386″ name=»com_1c_MobileBarcodeScanner»/>
    <component os=»Android» path=»com_1c_MobileBarcodeScanner_1_0_3_2.apk» codeType=»java» type=»native» arch=»i386″ name=»com_1c_MobileBarcodeScanner»/>
    <component os=»Android» path=»libcom_1c_MobileBarcodeScanner_ARM_1_0_3_2.so» codeType=»c++» type=»native» arch=»ARM» name=»com_1c_MobileBarcodeScanner»/>
    <component os=»Android» path=»com_1c_MobileBarcodeScanner_1_0_3_2.apk» codeType=»java» type=»native» arch=»ARM» name=»com_1c_MobileBarcodeScanner»/>
    </bundle>

    По аналогии, как в комментарии (56)

    Reply
  63. hobi

    Добрый день.

    Можно ли каким-то образом использовать сборку из нескольких конфигураций, в каждую из которых встроена компонента сканирования ?

    Пока только с одной конфигурацией в сборке заработало…

    Reply
  64. koupny

    Добрый день. А у кого то получалось отловить нажатия на встроенной клавиатуре?

    Reply
  65. koks17v

    Прекрасно, спасибо, работает идеально! А можно получить исходники?

    Reply
  66. temsan

    (11) Заработало на ТСД Honeywell EDA50K. Спасибо! До этого были сомнения, т.к. другой сервис для Android? работающий чкерез локальные уведомления не взлетел на 8.3.13.50

    Reply
  67. pushking

    ТСД Caribe PL-40L (Android 7.0)

    ИмяВнешнегоСобытия = «scan.rcv.message»;
    
    РезультатПодключенияВК = ПодключитьВнешнююКомпоненту(«ОбщийМакет.ДрайверСканераUniversalBroadcast», «Broadcasts», ТипВнешнейКомпоненты.Native);
    Если РезультатПодключенияВК = Истина Тогда
    
    Попытка
    глВнешняяКомпонентаUniversalBroadcast = Новый(«AddIn.Broadcasts.UniversalBroadcast»)
    Исключение
    СтруктураОтвета.Вставить(«Ошибка», «Ошибка создания класса «»UniversalBroadcast»»!»);
    Конецпопытки;
    
    Если НЕ глВнешняяКомпонентаUniversalBroadcast = Неопределено Тогда
    Попытка
    глВнешняяКомпонентаUniversalBroadcast.УстановитьПараметр(«FilterName», ИмяВнешнегоСобытия);
    глВнешняяКомпонентаUniversalBroadcast.УстановитьПараметр(«CaptureData», ОбщийМодульКлиентСервер.ПодставитьПараметрыВСтроку(глВнешняяКомпонентаUniversalBroadcast.ПолучитьШаблонОписанияДанных(), «barocode», XMLСтрока(Истина), XMLСтрока(15)));
    Исключение
    СтруктураОтвета.Вставить(«Ошибка», «Ошибка при установке параметра «»CaptureData»»!»);
    Конецпопытки;
    КонецЕсли;
    
    Иначе
    СтруктураОтвета.Вставить(«Ошибка», «Ошибка подключения компоненты «»UniversalBroadcast»»!»);
    КонецЕсли;

    Показать

    Reply
  68. Cube_krsk

    Спасибо! Классная компонента!

    Использовал для сканирования штрихкодов на следующих ТСД: Honeywell EDA50 и HT380K.

    На обоих ТСД проверил работоспособность под платформой 8.3.10.84 и 8.3.13.45 — работает на обоих. Поэтому, просьба автору: поставь режим совместимости в cf в значение «8.3.10» — проверено, работает.

    Reply
  69. IgorKissil

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

    Reply
  70. KostyaBu

    Сканер использует datawedge, Сканер LPT82

    В настройках datawedge стоит send Barcode data — clipboard (Есть еще keyboard )

    пример с батарейкой работает превосходно.

    Но совершенно не могу поймать Шк, Событие есть, а шк в XML нет. Прошу подсказки.

    ИмяСобытия = «DATA_SCAN»;

    имя поля как написано выше «com.symbol.datawedge.data_string»

    barcode = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,»com.symbol.datawedge.data_string»,XMLСтрока(Ложь),XMLСтрока(8));

    Компонента.УстановитьПараметр(«CaptureData»,barcode);

    пожалуйста подскажите, что не так.

    Reply
  71. KostyaBu

    Сканер использует datawedge, Сканер LPT82

    В настройках datawedge стоит send Barcode data — clipboard (Есть еще keyboard )

    пример с батарейкой работает превосходно.

    Но совершенно не могу поймать Шк, Событие есть, а шк в XML нет. Прошу подсказки.

    ИмяСобытия = «DATA_SCAN»;

    имя поля как написано выше «com.symbol.datawedge.data_string»

    barcode = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,»com.symbol.datawedge.data_string»,XMLСтрока(Ложь),XMLСтрока(8));

    Компонента.УстановитьПараметр(«CaptureData»,barcode);

    пожалуйста подскажите, что не так.

    Reply
  72. WellMaster

    Шикарная компонента. Завелось практически сразу. Надо только разобраться в передаваемых параметрах.

    Спасибо.

    Reply
  73. Cube_krsk

    Столкнулся с проблемой: компонена не умеет передавать русский шрифт в сообщениях. Приходят крякозябры.

    Через другие приложения на ТСД русский текст сканируется со штрихкодов, а вот через компоненту приходят крякозябры.

    Reply
  74. Cube_krsk

    Также неплохо было бы получать со сканера XML без обработки компонентой, так как я не знаю, как называются поля в XML, чтобы подставить их в ПолучитьШаблонОписанияДанных()…

    Reply
  75. IgorKissil

    (74) Что значит без обработки? XML формируется в компоненте

    Reply
  76. IgorKissil

    (73) Кодировка XML устанавливается по дефолту из настроек ОС. Т.е. если у вас андроид настроен на русскую локаль все должно быть ОК (проверил). Другое дело если стоит английская или другая локализация. Возможно в будущих версиях добавлю программную настройку

    Reply
  77. maxxxon34

    Сканер АТОЛ Smart.Lite, не отлавливает событие сканирования, имя оповещения взял из настроек сканера, возможно неправильно указал категорию, можно уточнить в каком виде передается параметр категории?

    Reply
  78. maxxxon34

    Вопрос решен, не ловит оповещение, если неверно указан формат данных. Для АТОЛ SMART.LITE:

    Компонента.УстановитьПараметр(«FilterName», «com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST»);
    Компонента.УстановитьПараметр(«CaptureData»,СтрокаПараметров, «EXTRA_BARCODE_DECODING_DATA»,
    XMLСтрока(Ложь), XMLСтрока(0)));
    Reply
  79. Cube_krsk
    Reply
  80. Cube_krsk

    (75) Немного не так выразился.

    Неплохо было бы, чтобы компонента имела функцию, возвращающую массив имен доступных полей интента.

    Вот тут есть пример: http://forum.infostart.ru/forum92/topic166842/message2034308/#message2034308

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

    Reply
  81. IgorKissil

    (81) Но для этого необходимо вначале получить броадкастовое событие

    Reply
  82. Cube_krsk

    (83) Пусть хоть так. Сейчас вообще нет возможности получить список полей, доступных для отслеживания. Например, на ТСД EDA50 я никак не могу найти в интернете имя поля, возвращающего тип штрихкода (EAN13, EAN8, DataMatrix и т.д.). Занимаюсь брутфорсом… Причем безуспешно.

    Поэтому я и писал в (74), что неплохо было бы получить XML, содержащий список всех возможных полей. А, если, этот список будет ещё и значения этих полей содержать — вообще будет шикардос!

    Можно сделать в виде служебного поля «AllData» и при получении XML, она будет содержать всевозможные поля интента с их значениями.

    Reply
  83. Cube_krsk

    (73) В настройках сканера EDA50 стояла кодировка ISO 8859-1. Поставил UTF-8 и русский шрифт начал сканироваться нормально.

    Reply
  84. arancheev.s
    59. IgorKissil 185 16.11.18 17:14

    (58) Думаю это потому что компонента собрана для андроида начиная с 19й версии (4.4). Будет время сделаю ребилд с 16-й

    Подскажите, еще ребилд с 16-ой не делали ? Очень нуно.

    Спасибо.

    Reply
  85. IgorKissil

    (92) Сделан в последнем релизе около двух месяцев назад

    Reply
  86. arancheev.s

    (93)

    Я прошу прощение. Не посмотрел информации перед тем как писать.

    У меня Android 4 (API Level 14 насколько я понял). Вот с него есть возможность собрать компоненту. А то два ТСД есть с 4 и 4.1, события отлавливаются, а данные приходят пустые. Хотелось бы все терминалы на единую Вашу компоненту посадить.

    (На 5.1 все норм)

    Заранее большое спасибо.

    Reply
  87. IgorKissil

    (94) Если нет ограничений по используемому функционалу (в компоненте) сделаю

    Reply
  88. arancheev.s

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

    Reply
  89. IgorKissil

    (96) Только что выложил релиз 1.1.1 под андроид API 14. После обновления публикации пробуйте.

    Reply
  90. vita8383

    (61) А вы манифест не правили? У меня при следующем коде, ШК не перехватывается:

    
    Процедура ПриОткрытии(Отказ)
    
    ИмяСобытия = «scan.rcv.message»;
    
    Если ПодключитьВнешнююКомпоненту(«ОбщийМакет.Component», «Broadcasts», ТипВнешнейКомпоненты.Native) Тогда
    Компонента = Новый(«AddIn.Broadcasts.UniversalBroadcast»);
    Компонента.УстановитьПараметр(«FilterName»,ИмяСобытия);
    ШаблонДанных = Компонента.ПолучитьШаблонОписанияДанных();
    barcode = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,»com.symbol.datawedge.data_string»,XMLСтрока(Ложь),XMLСтрока(0));
    Компонента.УстановитьПараметр(«CaptureData»,barcode);
    Иначе
    ПоказатьПредупреждение(,»Компонента не подключена»,5);
    ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
    
    КонецПроцедуры
    
    
    

    Показать

    Reply
  91. vita8383

    (58) Добрый день, удалось победить проблему на данном устройстве?

    Reply
  92. s.neumyvakin_2015

    (23)

    (105)

    Добрый день!

    К сожалению нет. Что то я наверное не так делаю раз у всех работает а у меня нет.

    Reply
  93. markers

    (67) Большое спасибо! Работает!

    Reply
  94. Meteorage

    (70) Приветствую! Ты решил свою проблему при помощи этой компоненты?

    Reply
  95. KostyaBu

    (150) и да и нет. сейчас часть терминалов использует эту обработку а часть самописную (написанную тоже благодаря бесплатной статье автора).Но насколько мне известно автор доработал функционал с буфером и все работает.

    Reply
  96. volchica

    (45) можно подробнее.. у меня такая же ситуация, компонента подключается, а событие не срабатывает. Я публикую конфу и запускаюсь с моб.платформы (если это важно в данном случае).

    «заменил по инструкции интент фильтр» — поясните что вы сделали..

    Reply
  97. Rokstedi

    (160)

    нструкции интент ф

    Нужно обизательно сборщиком приложение собрать и сборщику подсунуть платформу откорректированную. Иначе 1с морозится от этих броадкаст сообщений!

    Reply
  98. alexex

    (37)

    Разобраться как это делать для приложений с компонентами у меня не хватило времени/терпения.

    Во время публикации приложения в настройках http-сервера необходимо добавить типы MIME для следующих расширений: .so, .apk, .dylib, .a. Тип MIME: application/octet-stream.

    рестарт web сервера

    Reply
  99. Azamatex

    (17)Я настроил сервер отладки (проверил, отладка идет), но ошибка компонента не подключена все равно выходит. Можно как-нибудь отключить этот нюанс?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *