Управляемый Android Service перехвата сообщений Broadcast со сканера штрих-кодов в 1С (ver. 1.2.1)

Программирование - Мобильные приложения

Service перехвата сообщений Broadcast со сканера штрих-кодов в мобильную платформу 1С (эмуляция внешнего события). Позволяет получать и обрабатывать Штрих-коды не в разрыв клавиатуры (определенное активное окно), а "под капотом". Поддержка запуска/остановки из программного кода 1С.

ВНИМАНИЕ! Компонента не имеет видимого интерфейса. При попытке запустить через иконку ничего происходить не будет!

Предыстория создания //xn--80appelehcm.xn--p1ai/public/586539/ (сначала ознакомиться)

На том этапе был создан сервис, который "жил сам по себе", запускался при старте системы, имел интерфейс и ручные настройки. Мне это показалось не достаточно удобным. Родилась идея отдельной компоненты. Она похожа на предыдущую, но управляется из 1С, не имеет интерфейса с настройками.

В модуль управляемого приложения прописываем:

Процедура ПриНачалеРаботыСистемы()
	
	ОбщегоНазначенияКлиент.ПодключитьГлобальноеСобытиеОповещения();
	ОбщегоНазначенияКлиент.ЗапуститьКомпонентуСканирования();
	
КонецПроцедуры

Процедура ПриЗавершенииРаботыСистемы()
	ОбщегоНазначенияКлиент.ОстановитьКомпонентуСканирования();
КонецПроцедуры

В модуль ОбщегоНазначенияКлиент

Процедура ПодключитьГлобальноеСобытиеОповещения() Экспорт
	#Если МобильноеПриложениеКлиент Тогда
		Оп = Новый ОписаниеОповещения("ОбработчикЛокальныхУведомлений", ЭтотОбъект);
		ДоставляемыеУведомления.ПодключитьОбработчикУведомлений(Оп);  
	#КонецЕсли
КонецПроцедуры

Процедура ГлобальноеСобытиеОповещения(Сообщение, ЧтоТоЕще = "") Экспорт

	Попытка
		Отправитель = Число(Сообщение.Отправитель);
	Исключение
		Возврат
	КонецПопытки;
	Если Отправитель = 1 Тогда
		Оповестить(Формат(Отправитель,"ЧГ="),Сообщение.Текст, "Сканирование ШК");
	Иначе 
		Возврат
	КонецЕсли;
КонецПроцедуры

Процедура ОбработчикЛокальныхУведомлений(Уведомление,Локальное,Показано, ЧтоТоЕще) Экспорт
	ГлобальноеСобытиеОповещения(Новый Структура("Отправитель,Текст",Уведомление.Текст,Уведомление.Данные));
КонецПроцедуры

&НаКлиенте
Процедура ЗапуститьКомпонентуСканирования() Экспорт
	#Если МобильноеПриложениеКлиент Тогда
		НовЗП = Новый ЗапускПриложенияМобильногоУстройства();
		НовЗП.Действие = "com.barcodeto1c.action";
		НовЗП.ДополнительныеДанные.Добавить("ServiceState","Start"); //что сделать: Старт/Стоп
		НовЗП.ДополнительныеДанные.Добавить("ServiceSCAN_MESSAGE","scan.rcv.message"); //чей бродкаст ловить
        НовЗП.ДополнительныеДанные.Добавить("ServiceBarCodeField","barocode"); //в каком поле сканер возвращает штрих-код (если не задавать - по умолчанию barocode, что в большинстве случаев оно так)
		НовЗП.ДополнительныеДанные.Добавить("ServiceEventID","1"); //категория сообщение для 1С
		НовЗП.ДополнительныеДанные.Добавить("ServiceToast","Service STARTED!");//(не обязательно) просто покажет Тост при успехе
		НовЗП.ДополнительныеДанные.Добавить("ServiceBase_Name",ОбщегоНазначенияСервер.ПолучитьИДБазы());//если одна база - можно поставить ""
		Результат = НовЗП.Запустить(Истина);
		
		Если НЕ Результат = 77 Тогда
             //тут можно отловить что что-то не так. Возможно апк не установлена или что-то не сработало
		КонецЕсли;
	#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ОстановитьКомпонентуСканирования() Экспорт
	#Если МобильноеПриложениеКлиент Тогда
		НовЗП = Новый ЗапускПриложенияМобильногоУстройства();
		НовЗП.Действие = "com.barcodeto1c.action";
		НовЗП.ДополнительныеДанные.Добавить("ServiceState","Stop");
		НовЗП.ДополнительныеДанные.Добавить("ServiceToast","Service STOPED!");
		Результат = НовЗП.Запустить(Истина);
	#КонецЕсли

КонецПроцедуры

ПолучитьИДБазы() можно разными способами. Я её прописал в константы.

Успешный результат всегда равен 77 (просто число, мне так захотелось)

У формы должно быть прописано ОбработкаОповещения приблизительно так:

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	Если ИмяСобытия = "1" И ВводДоступен() Тогда
		ПолученШтрихКод(Параметр); //процедура для обработки ШК
	КонецЕсли;
КонецПроцедуры

 

Теперь мы можем стартовать сервис только по необходимости. Если у нас несколько баз - то ловить события только той базой, что запущена.

Распространяется "как есть". Надеюсь будет полезным.

Добавлено в версии 1.1

1) сервис может работать с некоторыми bluetooth-сканерами (у которых для настройки используется утилита DataWedge со строкой "посылки" com.hht.emdk.datawedge.data_string)

2) добавлена возможность самостоятельно указывать поле, в котором возвращается набор байт со сканера. По-умолчанию это "barocode". Если сервису передать строку НовЗП.ДополнительныеДанные.Добавить("ServiceBarCodeField","svoe_pole") - то информация будет читаться из него

Оптимизация по размеру файла. А то жрала много памяти предыдущая ;)

Добавлено в версии 1.2.1

- Поддержка устройства CipherLab 9700A (ну и наверное его подобными)

 

28/03/18 Добавлены исходники

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

Наименование Файл Версия Размер
BarCodeComponent_ver_1_2_1.apk
.apk 47,13Kb
28.03.18
55
.apk 1.2.1 47,13Kb 55 Скачать
BC2OneC_sources.zip
.zip 47,62Kb
28.03.18
13
.zip 1.2.1 47,62Kb 13 Скачать

См. также

Вознаграждение за ответ
Показать полностью
Комментарии
1. Сергей Главатских (ViperGSV) 15.02.17 11:12 Сейчас в теме
Совместимость с какими версиями Android? Интересует работа на старых версиях 2.3.х
2. Dmitry Po (DMon) 66 15.02.17 15:27 Сейчас в теме
(1) Я писал под 4.0.3. Если нужно - могу понизить версию.
3. Dmitry Po (DMon) 66 15.02.17 18:53 Сейчас в теме


(1) добавил, можно попробовать. Но работу не гарантирую, так как девайса с 2.3 нету
4. Дмитрий Бертман (Batman) 136 15.02.17 23:08 Сейчас в теме
Небольшое замечание. Там в описании (жирным шрифтом) - опечатка - "Поддержка заКуска/"
5. aspirator 23 (aspirator23) 367 18.02.17 16:23 Сейчас в теме
(4) Автор ушел за остальным к закуске. Вернется - исправит. :)
6. Dmitry Po (DMon) 66 18.02.17 21:39 Сейчас в теме
(5)очень остроумно, спасибо)
7. Дмитрий Кремезной (ASK7) 02.03.17 23:03 Сейчас в теме
Добрый день коллеги! В поисках решения своей проблемы наткнулся на вашу статью, за что автору огромное спасибо. Я правильно понимаю, чтобы работала данная утилита НЕ НУЖНО! "потрашить, допиливать" платформу как это делал dewersia http://infostart.blog-buh.ru/public/547851. Утилита работает на типовой мобильной платформе 1с?
9. Dmitry Po (DMon) 66 03.03.17 08:10 Сейчас в теме
(7) Привет! правильно, в платформе ничего менять не нужно. Сервис живёт сам по себе, управляется из кода 1С. А можно Вашу проблему в ЛС? Может я подобное уже решал)
8. Ruslan Ruslan (flyer) 202 03.03.17 07:55 Сейчас в теме
я вот на еще один способ наткнулся можно сразу с dev0 читать т.е. с потока. щас работаю над этим если все получиться то выложу тут исходники глянете как сделал.
10. lion-killer Bilous (lion-killer) 20 03.03.17 17:50 Сейчас в теме
Здравствуйте, коллеги. Можно ли подключить USB сканер к планшету на Android с помощью этого приложения. Если да, то какова последовательность действий. Объясните чайнику )))
11. Dmitry Po (DMon) 66 04.03.17 12:04 Сейчас в теме
(10) С таким не сталкивался на практике, но думаю что реально. Нужно только знать какое сообщение бродкастом рассылается от подключенного сканера. Как узнать? Да много вариантов. Самый простой - анализ logcat к примеру.
12. lion-killer Bilous (lion-killer) 20 09.03.17 18:03 Сейчас в теме
(11) Если переключить сканер в режим эмуляции клавиатуры - видна посылка штрих кода посимвольно (во вложении), в других режимах никаких событий нет ((
Прикрепленные файлы:
20. Михаил Приходько (pri_hod) 88 06.05.17 13:51 Сейчас в теме
(12) Удалось отловить событие?
22. Davit Amirxanyan (Davidmad777) 08.05.17 00:51 Сейчас в теме
Удалось отловить событие

(20)
Удалось отловить событие?
да
23. Михаил Приходько (pri_hod) 88 08.05.17 13:03 Сейчас в теме
(22) как ? Я уже все перепробывал...
51. andrey P (andrey314) 10 11.10.17 07:56 Сейчас в теме
(22) Присоединяюсь к вопросу
13. Алексей Глазунов (LiolickGG) 13.04.17 06:22 Сейчас в теме
Спасибо очень помогло, ТСД зажил новой жизнью.
14. Dmitry Po (DMon) 66 13.04.17 09:00 Сейчас в теме
(13) Рад за полезность :)
Какое именно у Вас устройство ТСД?
15. Василий Телкин (1c-kt) 24.04.17 02:00 Сейчас в теме
Спасибо, то что нужно. Возможно ли еще получать оповещения от нажатия клавиатурных клавиш?
18. Dmitry Po (DMon) 66 24.04.17 14:53 Сейчас в теме
(15) Попробую реализовать и данный механизм когда будет посвободнее время. Спасибо за идею)
32. Дмитрий Федоров (demONx7) 29.06.17 04:18 Сейчас в теме
(18) Дмитрий, ну что, получилось реализовать? В данный момент занимаюсь аналогичной задачей. Думаю многим будет интересно посмотреть на реализацию данного действия. Информации в интернете по этому поводу - NULL.
33. Dmitry Po (DMon) 66 30.06.17 07:25 Сейчас в теме
(32) нет, не занимался этим. Свободного времени нет пока. Да и практических задач тоже.
16. Николай Беляев (freez1301) 219 24.04.17 11:26 Сейчас в теме
Добрый день, скачал оба файла и ни один не запустился. Версия API 18. Ошибка следующего характера
There was a problem parsing the package

флажок на установку из неизвестных источник стоит, флажок Проверять приложения - снят. Устройство - ТСД Urovo sq42. Другие apk не из маркета ставятся без проблем
17. Николай Беляев (freez1301) 219 24.04.17 12:03 Сейчас в теме
(16) проблему решил, передал apk с пк на тсд, все установилось. До этого качал апк с почты. Странное поведение ОС )
19. Николай Беляев (freez1301) 219 24.04.17 15:57 Сейчас в теме
Поделюсь своим опытом работы с опубликованным выше сервисом и ТСД Urovo sq42:
1. обязательно нужно указывать верный источник броадкаста (как посмотреть автор написал)
2. сканер должен быть настроен не в разрыв клавиатуры, в моем случае в стандартных настройках были настройки сканера, там есть возможность указать режим.
После этого все взлетело, автору спасибо!
21. Davit Amirxanyan (Davidmad777) 08.05.17 00:50 Сейчас в теме
Поделюсь своим опытом работы с опубликованным выше сервисом наТСД Newland:
Все норм работает
Даже на других конфигурациях пробовал
34. Петро (user651504_anah0ret) 07.07.17 16:50 Сейчас в теме
(21) А у Вас на Newland имя бродкаст сообщения какое, "scan.rcv.message"?
24. Davit Amirxanyan (Davidmad777) 08.05.17 16:12 Сейчас в теме
У тебя Есть Пример конфигурации с работы Acode?
25. Михаил Приходько (pri_hod) 88 08.05.17 23:25 Сейчас в теме
46. Дима Дима (Dimitrij) 26.09.17 11:11 Сейчас в теме
(26) Добрый день,

Не сталкивались с проблемой что при установки приложения на ТСД выскакивает "Cannot call synchronous methods on the client"?

Заранее спасибо!
27. Davit Amirxanyan (Davidmad777) 10.05.17 10:04 Сейчас в теме
Это пример Конфи там в макете есть и Acode tools apk и Примеры использования
28. Davit Amirxanyan (Davidmad777) 10.05.17 10:07 Сейчас в теме
29. Михаил Приходько (pri_hod) 88 13.05.17 00:32 Сейчас в теме
(28) Спасибо за конфигурацию, поставил, но так сканер и не получилось заставить работать. У меня сканер подключен к телефону через USB otg host, в блокнот сканирует без проблем, так вот заставить работать через уведомления так как в этой статье так и не получается, куда копать? как перевести "не в разрыв клавиатуры", нигде настроек нет никаких.
30. Dmitry Po (DMon) 66 13.05.17 09:16 Сейчас в теме
(29) Боюсь что никак. Для телефона он просто OTG клавиатура.
По крайне мере мне не известны случаи успешного применения USB не в разрыв клавиатуры
31. Davit Amirxanyan (Davidmad777) 13.05.17 10:23 Сейчас в теме
35. Арман Б. (Dream_kz) 70 03.08.17 18:54 Сейчас в теме
А как узнать "ServiceBarCodeField" и "ServiceSCAN_MESSAGE"?
Попался на руки китайский ТСД qunsuo pda401, в родное демо приложение сканирует, а сюда не хочет. Декомпилировал приложение, но не могу найти какой броадкаст он ловит.
36. Dmitry Po (DMon) 66 03.08.17 23:14 Сейчас в теме
(35) А чем декомпилировали? Может не всё разложилось?

Выложите где-то на шару это приложение и скиньте ссылку. Я посмотрю.
37. Арман Б. (Dream_kz) 70 04.08.17 11:15 Сейчас в теме
(36)Да вроде все. В манифесте посмотрел интент фильтр, попробовал по нему, и по другим событиям, но мне кажется я не то поле указал, в котором лежит штрихкод.

Здесь и само приложение, и исходники к нему (нашел на сайте производителя)

http://dropmefiles.com/JGlaf

Попробовал события:
ismart.intent.scandown
com.qs.scancode
com.zkc.scancode
с полем code, и barocode

Но безрезультатно.
38. Александр Герасимов (as.kharlov) 21.08.17 19:59 Сейчас в теме
У меня ТСД Motorola Symbol MC3200. Сканер штрихкода в разрыв клавиатуры. Acode не взлетели. Эта утилита может работать?
И как узнать какой бродкаст прописывать для моей модели? Гугл в ответе не помог.
Спасибо!
39. Александр Герасимов (as.kharlov) 21.08.17 20:03 Сейчас в теме
Прошу прощения, не заметил сразу сообщения про logcat. Завтра попробую
40. Николай K (nkroshko) 25.08.17 16:28 Сейчас в теме
Спасибо за программу! Удалось установить взаимодействие с 1С на ТСД Атол Smart Droid.
заработало с такими установками:
ServiceSCAN_MESSAGE = DATA_SCAN
что странно независимо от того, что указываешь в ServiceBarCodeField все равно вызывает событие в 1С :)
Shef_zeon; gorevg; perpleks; +3 Ответить
61. Evgeny Goryachev (gorevg) 8 06.11.17 22:19 Сейчас в теме
(40)
Спасибо!
Заработало.
Вот так нужно сделать:
НовЗП.ДополнительныеДанные.Добавить("ServiceSCAN_MESSAGE","DATA_SCAN");
41. Anton Marinin (/// ANTONIO) 29.08.17 16:43 Сейчас в теме
Дмитрий, спасибо за компоненту! Шикарная вещь.
Успешно работает с линейными 1D сканерами Urovo i6200s.
Но вот на сканере 2D Urovo i6200s перестает работать сканирующее устройство через некоторое время использования.
Вместе со службой поддержки перепробовали различные варианты прошивки, ничего не помогает.
Луч сканера есть, но ничего не происходит, даже в родном приложении.
Помогает отключение сканирующего модуля и его включение в настройках Android.
Служба поддержки предполагает, что компонента вешает "камеру" сканера 2D и происходит Crash.
Строки Permission Denial повторяются постоянно, видимо, на каждое сканирование.

В логах при этом такой текст, повторяется
Лог с устройства

Дмитрий, есть мысли, в чем может быть проблема?
Был бы благодарен за помощь.
42. Александр Герасимов (as.kharlov) 30.08.17 12:21 Сейчас в теме
Dmitry Po.
Вопрос:
Пользуюсь ТСД Motorola Symbol MC9200
Настроил при сканировании штрих-кода отсылать его как эммуляцию ввода с клавиатуры и broadcast intent
подключил adb. Смотрю logcat чтоб понять какой бродкаст ловить. Вот изменения logcatа после сканирования штрихкода:
W/SoundPool(  730):   sample -1 not READY
E/ImagerAdapter(  730): Guard passed
E/NotificationService(  454): Not posting notification with icon==0: Notificatio
n(pri=0 contentView=com.symbol.datawedge/0x1090064 vibrate=null sound=null defau
lts=0x0 flags=0x11 kind=[null])
E/NotificationService(  454): WARNING: In a future release this will crash the a
pp: com.symbol.datawedge
E/TIAdapter(  730): ID-VIDIOC_SIZEDQBUF Acquistion Stopped mMaxFrameSkip = 0
D/dalvikvm(  730): GC_CONCURRENT freed 914K, 17% free 5774K/6884K, paused 6ms+5m
s, total 54ms
D/InputMethodService(  587): Params passed to SoftKeyboard android.util.MapColle
ctions$KeySet@bc86db18
D/InputMethodService(  587): keystroke_action_char -1
D/InputMethodService(  587): ime_output_enabled true
D/InputMethodService(  587): running Injector
D/InputMethodService(  587): Injector: doInject
E/NotificationService(  454): Not posting notification with icon==0: Notificatio
n(pri=0 contentView=com.symbol.datawedge/0x1090064 vibrate=null sound=null defau
lts=0x0 flags=0x11 kind=[null])
E/NotificationService(  454): WARNING: In a future release this will crash the a
pp: com.symbol.datawedge
I/wpa_supplicant(  572): signalpoll buffer: RSSI=-47
I/wpa_supplicant(  572): LINKSPEED=65
I/wpa_supplicant(  572): NOISE=-71
I/wpa_supplicant(  572): FREQUENCY=5220
E/NotificationService(  454): Not posting notification with icon==0: Notificatio
n(pri=0 contentView=com.symbol.datawedge/0x1090064 vibrate=null sound=null defau
lts=0x0 flags=0x11 kind=[null])
E/NotificationService(  454): WARNING: In a future release this will crash the a
pp: com.symbol.datawedge
I/wpa_supplicant(  572): signalpoll buffer: RSSI=-46
I/wpa_supplicant(  572): LINKSPEED=65
I/wpa_supplicant(  572): NOISE=-70
I/wpa_supplicant(  572): FREQUENCY=5220
Показать


Отсканированный штрихкод 120717109704 (EAN13)
Не вижу в логкате ни имени бродкаста, ни чего-либо похожего на отсканированный штрихкод.
Подскажите куда копать? Как определить имя бродкаста?
Заранее большое спасибо!
43. Dmitry Po (DMon) 66 30.08.17 12:40 Сейчас в теме
(42) Это блютуз сканер? "com.hht.emdk.datawedge.data_string" не подходит?
Есть ли утилита внутренняя для настройки сканера? Я обычно разбираю её чтоб глянуть.
44. Александр Герасимов (as.kharlov) 30.08.17 14:19 Сейчас в теме
(43) Dmitry Po,
Спасибо за ответ!
сканер встроенный в терминал сбора данных
В настройках есть "Scanner selection". В этом меню есть пункт "Bluetooth Scanner disconnected". Если выбрать его, то при запуске 1С ругается что блютуз сканер не подключен.
у меня выбран пункт "Scanner selection" = "Auto (2D Barcode Imager)".
Из моего ответа можно понять блютуз сканер или нет?

прописал бродкаст "com.hht.emdk.datawedge.data_string"
ОбработкаОповещения не возникла.

Внутренняя утилита для настройки сканера есть. Называется DataWedge. В ней редактирую профили сканирования. Об этой утилите Вы спрашивали? Как ее можно разобрать?

Кстати, база 1с у меня не скомпилированный apk, а запускается как конфигурация из мобильной платформы, установленной на терминале. Это может влиять на результат?
Конфигурация у меня одна поэтому в параметре "ServiceBase_Name" оставил "".
45. Александр Герасимов (as.kharlov) 30.08.17 14:41 Сейчас в теме
Dmitry Po,
И еще:
НовЗП.ДополнительныеДанные.Добавить("ServiceBarCodeField","barocode")
у Вас написано: //в каком поле сканер возвращает штрих-код (если не задавать - по умолчанию barocode, что в большинстве случаев оно так)
"в большинстве случаев так, а в моем конкретном случае это не может отличаться?
47. andrey P (andrey314) 10 10.10.17 13:42 Сейчас в теме
Блютуз сканер Zebra DS6878-SR будет работать? В режиме HID ?
48. Dmitry Po (DMon) 66 10.10.17 17:19 Сейчас в теме
(47) Если есть в устройстве утилита от сканера, которая генерит бродкас сообщения - теоретически возможно. На практике таким не занимался.
49. andrey P (andrey314) 10 10.10.17 17:53 Сейчас в теме
Подскажите, вы какие-нибудь другие блютус сканеры подключали? И в каком режиме?
50. Dmitry Po (DMon) 66 10.10.17 21:34 Сейчас в теме
(49) Внизу публикации указано что добавлено в версию 1.1. Делал это вспелую для коллеги по инфостарту. По его словам всё заработало. Сканер должен быть НЕ в разрыв клавиатуры.
52. Денис Лупейкин (Lupeykin) 2 16.10.17 06:51 Сейчас в теме
нет внешнего события, только зря потратил деньги, исходников APK автор не выложил неизвестно почему не работает.
53. Dmitry Po (DMon) 66 16.10.17 10:59 Сейчас в теме
(52) и Вы думаете, что у всех кто скачал тоже нет внешнего события?... и даже те, кто выражал благодарность в комментариях - фейковые? А может нужно причину поискать у Вас на стороне, а не сразу жалеть потраченные копейки? И автор не обязан выкладывать исходники для утилиты за 1 стармани в статусе "как есть". Не нравится - сделайте свою и лучше, выложите на Инфостарт и вернете "зря потраченные деньги"! Хорошего дня!
55. Иван Горюнов (user847620) 24.10.17 11:38 Сейчас в теме
Добрый день!
Подскажите, пожалуйста, какое значение нужно задавать для ServiceSCAN_MESSAGE? Пробовал те, что указаны в настройках сканера (на фото), уведомление в 1с не приходит. Logcat тоже прикрепил. Нажатие кнопки сканера в строках 10117-10229 (первые строки тоже оставил, вдруг там какая-то нужная информация). Сканер DataLogic DL-Axist.
Прикрепленные файлы:
logcat.zip
56. andrey P (andrey314) 10 25.10.17 10:27 Сейчас в теме
Подскажите по ПолучитьИДБазы(). Если например у меня в мобильном приложении несколько баз? Что я должен сюда передавать?
57. Dmitry Po (DMon) 66 25.10.17 15:05 Сейчас в теме +10 $m
(56)
Не помню уже где это нашел, но писали очень хорошие люди, им спасибо!
Я получаю и записываю значение в константу.
На форме с константой, в НачалоВыбора пишем:

&НаКлиенте
Процедура ИдентификаторБазыНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	#Если МобильноеПриложениеКлиент Тогда
	СЗ = Новый СписокЗначений;
	
	Базы = Новый ЧтениеТекста ("/data/data/com.e1c.mobile/files/1C/1cem/ibases.v8i");
	Стр = Базы.ПрочитатьСтроку();
	_Имя = ""; _ИД = "";
	Пока Стр <> Неопределено Цикл 
		Если Лев(Стр, 1) = "[" Тогда
			_Имя = Стр;
		КонецЕсли;
		Если Лев(Стр, 3) = "ID=" Тогда
			_ИД = СтрЗаменить(Стр,"ID=","");
			СЗ.Добавить(_ИД,_Имя);
		КонецЕсли;
		Стр = Базы.ПрочитатьСтроку();	
	КонецЦикла;
	
	Эл = СЗ.ВыбратьЭлемент();
	НаборКонстант.ИдентификаторБазы = Эл.Значение;
	
	#КонецЕсли
КонецПроцедуры

Показать
savinsva; evgeny43; andrey314; +3 Ответить
58. andrey P (andrey314) 10 25.10.17 16:51 Сейчас в теме
59. Evgeny Goryachev (gorevg) 8 03.11.17 15:01 Сейчас в теме
А кто-нибудь на АТОЛ Smart.Droid смог запустить? Уже несколько дней вожусь. Функция ЗапуститьКомпонентуСканирования отрабатывает. Ошибок нет. Результат =77. Сканер пищит, что отсканировал, но до 1с не доходит...
60. Dmitry Po (DMon) 66 03.11.17 17:05 Сейчас в теме
(59)
У формы
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	Если ИмяСобытия = "1" И ВводДоступен() И НЕ флВводСН Тогда
		ПолученШтрихКод(Параметр);
	КонецЕсли;
КонецПроцедуры

Показать

что-то подобное прописано?

И ПриНачалеРаботыСистемы всё ли правильно описано?
проверьте ещё раз
62. Дмитрий Иващенко (Igel) 4 09.11.17 13:22 Сейчас в теме
День добрый.
Кто может подсказать, а какой Broadcast ServiceSCAN_MESSAGE у ТСД CipherLab RS30 / RS50?
63. Dmitry Po (DMon) 66 10.11.17 11:05 Сейчас в теме
(62) Есть встроенная утилита для управления сканером?
Если да - то в ней должно быть какое-то поле для тестирования что сканер работает.
Если да - то эта утилита является слушателем бродкаста и соответственно в ней прописано какой именно слушается.
Остается только достать эту утилиту с устройства (apk-файл), разобрать его и посмотреть.

З.Ы. Как разобрать - это уже другая тема.
65. Владимир Мельниченко (VladimirMelnychenko) 20.11.17 19:35 Сейчас в теме
(63)
утилиту

Добрый день.
Подскажите пожалуйста, как можно определить параметры "ServiceSCAN_MESSAGE" И "scan.rcv.message".
Разобрал apk родной утилиты (http://dropmefiles.com/gnrhx) не могу разобраться что именно искать.
Терминал SunLux XL-868.
64. Дмитрий Иващенко (Igel) 4 10.11.17 12:56 Сейчас в теме
66. Евгений Буглов (evgeny43) 5 18.12.17 20:24 Сейчас в теме
Добрый вечер коллеги .

Скачал данное ПО .
Возникло несколько вопросов :
1) мобильное приложение в апк файл конвертировать не обязательно?
2)ни кто не знает какой бродкаст и поле со штрих кодом у Honeywell ScanPal EDA50K ?
Прикрепленные файлы:
67. Евгений Буглов (evgeny43) 5 18.12.17 22:15 Сейчас в теме
(66) хотя с 1 вопросом чет не подумал, отпадает, в противном случае нафиг идентификатор базы)
68. Евгений Буглов (evgeny43) 5 19.12.17 11:51 Сейчас в теме
(66) По второму вопросы , нашел часть информации, однако по прежнему не получается отловить бродкаст при помощи ПО

API GUID :
package sample.honeywell.com.intentapisample;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.view.menu.ActionMenuItemView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "IntentApiSample";
    private static final String ACTION_BARCODE_DATA = "com.honeywell.sample.action.BARCODE_DATA";
    /**
     * Honeywell DataCollection Intent API
     * Claim scanner
     * Package Permissions:
     * "com.honeywell.decode.permission.DECODE"
     */
    private static final String ACTION_CLAIM_SCANNER = "com.honeywell.aidc.action.ACTION_CLAIM_SCANNER";
    /**
     * Honeywell DataCollection Intent API
     * Release scanner claim
     * Permissions:
     * "com.honeywell.decode.permission.DECODE"
     */
    private static final String ACTION_RELEASE_SCANNER = "com.honeywell.aidc.action.ACTION_RELEASE_SCANNER";
    /**
     * Honeywell DataCollection Intent API
     * Optional. Sets the scanner to claim. If scanner is not available or if extra is not used,
     * DataCollection will choose an available scanner.
     * Values : String
     * "dcs.scanner.imager" : Uses the internal scanner
     * "dcs.scanner.ring" : Uses the external ring scanner
     */
    private static final String EXTRA_SCANNER = "com.honeywell.aidc.extra.EXTRA_SCANNER";
    /**
     * Honeywell DataCollection Intent API
     * Optional. Sets the profile to use. If profile is not available or if extra is not used,
     * the scanner will use factory default properties (not "DEFAULT" profile properties).
     * Values : String
     */
    private static final String EXTRA_PROFILE = "com.honeywell.aidc.extra.EXTRA_PROFILE";
    /**
     * Honeywell DataCollection Intent API
     * Optional. Overrides the profile properties (non-persistent) until the next scanner claim.
     * Values : Bundle
     */
    private static final String EXTRA_PROPERTIES = "com.honeywell.aidc.extra.EXTRA_PROPERTIES";

    private static final String EXTRA_CONTROL = "com.honeywell.aidc.action.ACTION_CONTROL_SCANNER";
    /*
        Extras
        "com.honeywell.aidc.extra.EXTRA_SCAN" (boolean): Set to true to start or continue scanning. Set to false to stop scanning. Most 

scenarios only need this extra, however the scanner can be put into other states by adding from the following extras.
        "com.honeywell.aidc.extra.EXTRA_AIM" (boolean): Specify whether to turn the scanner aimer on or off. This is optional; the default value 

is the value of EXTRA_SCAN.
        "com.honeywell.aidc.extra.EXTRA_LIGHT" (boolean): Specify whether to turn the scanner illumination on or off. This is optional; the 

default value is the value of EXTRA_SCAN.
        "com.honeywell.aidc.extra.EXTRA_DECODE" (boolean): Specify whether to turn the decoding operation on or off. This is optional; the 

default value is the value of EXTRA_SCAN
    */
    private static final String EXTRA_SCAN = "com.honeywell.aidc.extra.EXTRA_SCAN";

    private TextView textView;
    Button button;



    private BroadcastReceiver barcodeDataReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("IntentApiSample: ","onReceive");
            if (ACTION_BARCODE_DATA.equals(intent.getAction())) {
/*
These extras are available:
"version" (int) = Data Intent Api version
"aimId" (String) = The AIM Identifier
"charset" (String) = The charset used to convert "dataBytes" to "data" string
"codeId" (String) = The Honeywell Symbology Identifier
"data" (String) = The barcode data as a string
"dataBytes" (byte[]) = The barcode data as a byte array
"timestamp" (String) = The barcode timestamp
*/
                int version = intent.getIntExtra("version", 0);
                if (version >= 1) {
                    String aimId = intent.getStringExtra("aimId");
                    String charset = intent.getStringExtra("charset");
                    String codeId = intent.getStringExtra("codeId");
                    String data = intent.getStringExtra("data");
                    byte[] dataBytes = intent.getByteArrayExtra("dataBytes");
                    String dataBytesStr="";
                    if(dataBytes!=null && dataBytes.length>0)
                        dataBytesStr = bytesToHexString(dataBytes);
                    String timestamp = intent.getStringExtra("timestamp");
                    String text = String.format(
                            "Dat a:%s\n" +
                                    "Charset:%s\n" +
                                    "Bytes:%s\n" +
                                    "AimId:%s\n" +
                                    "CodeId:%s\n" +
                                    "Timestamp:%s\n",
                            data, charset, dataBytesStr, aimId, codeId, timestamp);
                    setText(text);
                }
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);
        button = (Button)findViewById(R.id.button);
        button.setText("Start Scan");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendBroadcast(new Intent(EXTRA_CONTROL)
                    .putExtra(EXTRA_SCAN, true)
                );
            }
        });
        Log.d("IntentApiSample: ", "onCreate");
    }
    @Override
    protected void onResume() {
        super.onResume();
//        IntentFilter intentFilter = new IntentFilter("hsm.RECVRBI");
        registerReceiver(barcodeDataReceiver, new IntentFilter(ACTION_BARCODE_DATA));
        claimScanner();
        Log.d("IntentApiSample: ", "onResume");
    }
    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(barcodeDataReceiver);
        releaseScanner();
        Log.d("IntentApiSample: ", "onPause");
    }
    private void claimScanner() {
        Log.d("IntentApiSample: ", "claimScanner");
        Bundle properties = new Bundle();
        properties.putBoolean("DPR_DATA_INTENT", true);
        properties.putString("DPR_DATA_INTENT_ACTION", ACTION_BARCODE_DATA);
        sendBroadcast(new Intent(ACTION_CLAIM_SCANNER)
                .putExtra(EXTRA_SCANNER, "dcs.scanner.imager")
                .putExtra(EXTRA_PROFILE, "DEFAULT")// "MyProfile1")
                .putExtra(EXTRA_PROPERTIES, properties)
        );
    }
    private void releaseScanner() {
        Log.d("IntentApiSample: ", "releaseScanner");
        sendBroadcast(new Intent(ACTION_RELEASE_SCANNER));
    }
    private void setText(final String text) {
        if (textView != null) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText(text);
                }
            });
        }
    }
    private String bytesToHexString(byte[] arr) {
        String s = "[]";
        if (arr != null) {
            s = "[";
            for (int i = 0; i < arr.length; i++) {
                s += "0x" + Integer.toHexString(arr[i]) + ", ";
            }
            s = s.substring(0, s.length() - 2) + "]";
        }
        return s;
    }
}

Код с сайта honeywell .

Информация по EDA50K
Yes, EDA50 supports broadcast mode and it need configure Settings->Scanning -> Internal Scanner -> Default Profile -> Data Processing Settings -> Data Editing Plugin->com.honeywell.sample.scanresultreceiver/.DataEditingPlugin, then customer application can receive scanned data via broadcast intent.


Общая информация по версиям андроид
How to use the Barcode Data Intent?
02.11.2017•HSM Article
ARTICLE NUMBER
000058703
QUESTION/PROBLEM
How to use the Barcode Data Intent?
APPLIES TO
Android 4.x, Android 6.x, Android 7.x
RESOLUTION
The Barcode Data Intent enables the reception and processing of barcode data without using an SDK or library.

The document DataCollectionIntentAPI_Guide.pdf has all the informations to use the Barcode Data Intent.

The attached sample code IntentApiSample shows the code usage for an Android application.

The lines
    ...
    private void claimScanner() {
        Log.d("IntentApiSample: ", "claimScanner");
        Bundle properties = new Bundle();
        properties.putBoolean("DPR_DATA_INTENT", true);
        properties.putString("DPR_DATA_INTENT_ACTION", ACTION_BARCODE_DATA);
        sendBroadcast(new Intent(ACTION_CLAIM_SCANNER)
                .putExtra(EXTRA_SCANNER, "dcs.scanner.imager")
                .putExtra(EXTRA_PROFILE, "DEFAULT")// "MyProfile1")
                .putExtra(EXTRA_PROPERTIES, properties)
        );
    }
...

will change the Internal Scanner settings to enable the Data Intent (properties.putBoolean("DPR_DATA_INTENT", true);) and set the Action to the registered Broadcast Receiver (properties.putString("DPR_DATA_INTENT_ACTION", ACTION_BARCODE_DATA);).
 
...
private static final String ACTION_BARCODE_DATA = "com.honeywell.sample.action.BARCODE_DATA";
...
    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(barcodeDataReceiver, new IntentFilter(ACTION_BARCODE_DATA));
        claimScanner();
        Log.d("IntentApiSample: ", "onResume");
    }

Depending on the device and CommonES installed, the Action value may have to be set manually. See "Settings" > "Scanning" > "Internal Scanner" > "Default profile" > "Data Processing Settings" > "Data Intent":
Показать
69. Евгений Буглов (evgeny43) 5 19.12.17 17:25 Сейчас в теме
(68) (66) наконец разобрался, что к чему , поле с байтовым значением кода "dataBytes" , а интент в данном случае, я задаю сам в настройках сканера,
и я указал scan.rcv.message, т.о сканер перестал сканировать в разрыв клавиатура и посылает сообщение по данному интенту , однако ПО по какой-то причине не перехватывает его.
 НовЗП = Новый ЗапускПриложенияМобильногоУстройства();
		НовЗП.Действие = "com.barcodeto1c.action";
		НовЗП.ДополнительныеДанные.Добавить("ServiceState","Start"); //что сделать: Старт/Стоп
		НовЗП.ДополнительныеДанные.Добавить("ServiceSCAN_MESSAGE","scan.rcv.message"); //чей бродкаст ловить
        НовЗП.ДополнительныеДанные.Добавить("ServiceBarCodeField","dataBytes"); //в каком поле сканер возвращает штрих-код (если не задавать - по умолчанию barocode, что в большинстве случаев оно так)
		НовЗП.ДополнительныеДанные.Добавить("ServiceEventID","1"); //категория сообщение для 1С
		НовЗП.ДополнительныеДанные.Добавить("ServiceToast","Service STARTED!");//(не обязательно) просто покажет Тост при успехе
		НовЗП.ДополнительныеДанные.Добавить("ServiceBase_Name","");//если одна база - можно поставить ""
		Результат = НовЗП.Запустить(Истина);
		
		Если НЕ Результат = 77 Тогда
             //тут можно отловить что что-то не так. Возможно апк не установлена или что-то не сработало
		КонецЕсли;
Показать

в чем может быть дело?

Версия мобильной платформы 8.3.9.74 ----- программа запускается через типовую мобильной платформу 1с(т.е не apk файл) .
Danil.Potapov; +1 Ответить
70. Евгений Буглов (evgeny43) 5 21.12.17 09:31 Сейчас в теме
Вопрос решился. данная модель , хотя и передает байтовое поле "dataBytes", но по какой то причине оно не преобразует его в строку для отправки в 1с.
Решался вопрос следующим образом: обработка была переписана на прием поле data в котором передается уже строковое представление штрих кода.
Для работы сканера данного устройства необходимы следующие настройки:
Меню Настройки->scanning->Internal Scanner-> тут либо в "default profile" делаете настройки, либо создаете новый профиль для 1с -> data processing settings-> тут нас интересуют следующие поля:
1)Scan to intent ставим галочку
2)Data intent ставим галочку , и проваливаемся в настройки данного поля.
настройки Data intent :
Action(поле отвечающие за наименование интента которое отправит сканер ) - тут я прописал scan.rcv.message .
остальные поля я не заполнял.



если кому интересно в коде андроид приложения я замел следующую строку :
public void onReceive(Context context, Intent intent) {
byte[] barcode = intent.getByteArrayExtra("barocode");-------->String barcode=intent.getStringExtra("data");
int lng = intent.getIntExtra("length", 0);
this.barcodeStr = new String(barcode, 0, lng);------> this.barcodeStr =barcode;
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);
}
}
Danil.Potapov; +1 Ответить
98. Сергей Неумывакин (s.neumyvakin_2015) 09.06.18 09:11 Сейчас в теме
(70) Добрый день!
Нам тоже привезли ТСД Honeywell. Не могли бы вы прислать переделанное андроид приложение?
99. Евгений Буглов (evgeny43) 5 09.06.18 18:02 Сейчас в теме
(98) Добрый вечер. оно есть в этой теме в 76 сообщении
71. Ivan Semenov (Just_J) 11.01.18 12:06 Сейчас в теме
Добрый день.

При запуске приложения перехвата из 1С оно возвращает 0, не подскажите что означает код возврата 0?
72. Dmitry Po (DMon) 66 11.01.18 19:58 Сейчас в теме
(71) Значит не запустилось. Проверьте правильность запуска.
Корректный старт делает выход по инструкции

setResult(77);

иначе - всё что угодно, но не 77
73. Ivan Semenov (Just_J) 12.01.18 08:33 Сейчас в теме
(72) Это может быть связано с неправильными передаваемыми параметрами в сервис? или же это проблема моего устройства?
74. Dmitry Po (DMon) 66 12.01.18 12:06 Сейчас в теме
(73) Напишите как вы передаете параметры, какое устройство, версия Android?
Поподробнее пожалуйста)
75. Ivan Semenov (Just_J) 15.01.18 08:43 Сейчас в теме
(74)ТСД:

zebra tc700h
android 4.4.3
На устройстве есть предустановленное приложение datawedge в нем можно настроить имя и категорию интента.

1С мобильная платформа 8.3.11.57.

Запускаю ваше приложение кодом взятым из этой темы. При запуске без ИД базы т.е. параметр ServiceBase_Name = "" приложение возвращает 0, если же указать ИД базы то оно запускается возвращает 77, но сообщения сканера не ловит.
76. Евгений Буглов (evgeny43) 5 15.01.18 10:40 Сейчас в теме
Попробуй для чипер лаба эту прогу.
просто для работы чип. лаба. мне пришлось вшивать в проект драйвер , который я нашел на самом тсд.
тролько она не работает как сервис после установки , как в этой теме , необходимо 1 раз зарегестрировать и все .
на код не обращай внимаения, просто писал под несколько разных тсд и решил все действия назвать com.HoneywellScan.action.

Процедура РегистрацияБазыВСканереHoneyWell()
	#Если МобильноеПриложениеКлиент  тогда
        НовЗП = Новый ЗапускПриложенияМобильногоУстройства();
		НовЗП.Действие="com.HoneywellScan.action";
		НовЗП.ДополнительныеДанные.Добавить("IdBase",ИдентификаторБазыНачалоВыбора()); //что сделать: Старт/Стоп
		Результат = НовЗП.Запустить(Истина);
	#КонецЕсли	
КонецПроцедуры

данная разработка так же подходит для тсд который я описал выше .









////////////////////////////////////////////////////////////­////
весь код с утановкой 
&НаКлиенте
Процедура УстановкаДрайверовШтрихКода()Экспорт 
	Если СлужебныеФункцииИПроцедурыКлиентСервер.КомпанентаСканированияУстановлена() тогда
		Возврат
	КонецЕсли;	
	
	МассивДрайверов=новый Массив;
	МассивДрайверов.Добавить("BarcodeHoneywell");
	

	 для Каждого ИмяМакета из  МассивДрайверов цикл
	//Если ДанныеДрайвера.ИнтеграционноеПриложение Тогда
	//	// Получение макета с сервера
	СсылкаНаФайл = СлужебныеФункцииИПроцедурыКлиентСервер.ПолучитьМакетДрайвера(ИмяМакета);
	ИмяФайлаВрем = ИмяМакета + ".apk";
	ВременныйКаталог = КаталогВременныхФайлов();
	Если ПолучитьФайл(СсылкаНаФайл, ВременныйКаталог + ИмяФайлаВрем, Ложь) Тогда
		ЗапуститьПриложение(ВременныйКаталог + ИмяФайлаВрем, , Истина);
		СлужебныеФункцииИПроцедурыКлиентСервер.ПодтвердитьУстановкуКомпаненты();
	Иначе
		ТекстОшибки = НСтр("ru='Ошибка установки драйвера.'");
		Сообщить(ТекстОшибки); 
	КонецЕсли;
	КонецЦикла;
////// до этого момента происходит установка
РегистрацияБазыВСканереHoneyWell();////// разовая регистрация (если база для которой используется драйвер меняется, то 
  ///регистрацию надо перезапускать от другой базы.
КонецПроцедуры
	
Функция ПолучитьМакетДрайвера(ИмяМакета) Экспорт
	
	Возврат ПоместитьВоВременноеХранилище(ПолучитьОбщийМакет(ИмяМакета));
	
КонецФункции

	
	
Процедура РегистрацияБазыВСканереHoneyWell()
	#Если МобильноеПриложениеКлиент  тогда
        НовЗП = Новый ЗапускПриложенияМобильногоУстройства();
		НовЗП.Действие="com.HoneywellScan.action";
		НовЗП.ДополнительныеДанные.Добавить("IdBase",ИдентификаторБазыНачалоВыбора()); //что сделать: Старт/Стоп
		Результат = НовЗП.Запустить(Истина);
	#КонецЕсли	
КонецПроцедуры
Показать



СлужебныеФункцииИПроцедурыКлиентСервер.КомпанентаСканированияУстановлена() и СлужебныеФункцииИПроцедурыКлиентСервер.ПодтвердитьУстановкуКомпаненты(); запись чтение константы в базе, о том что я уже установил драйвер и больше этого делать не надо.
Прикрепленные файлы:
BarcodeAndroid_1.3.apk
77. Евгений Буглов (evgeny43) 5 15.01.18 11:12 Сейчас в теме
&НаКлиенте
Функция  ИдентификаторБазыНачалоВыбора()
	
	СтандартнаяОбработка = Ложь;
	
	#Если МобильноеПриложениеКлиент Тогда
		СЗ = Новый СписокЗначений;
		
		Базы = Новый ЧтениеТекста ("/data/data/com.e1c.mobile/files/1C/1cem/ibases.v8i");
		Стр = Базы.ПрочитатьСтроку();
		_Имя = ""; _ИД = "";
		Пока Стр <> Неопределено Цикл 
			Если Лев(Стр, 1) = "[" Тогда
				_Имя = Стр;
			КонецЕсли;
			Если Лев(Стр, 3) = "ID=" Тогда
				_ИД = СтрЗаменить(Стр,"ID=","");
				СЗ.Добавить(_ИД,_Имя);
			КонецЕсли;
			Стр = Базы.ПрочитатьСтроку();    
		КонецЦикла;
		Эл = СЗ.ВыбратьЭлемент();
		Возврат Эл.Значение;
		
	#КонецЕсли
КонецФункции 
Показать

это уже было описанно в данной теме Dmitry Po (DMon) ( за что ему спасибо)
78. Илья Жернаков (Shef_zeon) 7 15.01.18 14:55 Сейчас в теме
Подскажите что делать если сканер возвращает
(String)intent.getStringExtra("EXTRA_BARCODE_DECODED_DATA")
79. Dmitry Po (DMon) 66 16.01.18 12:47 Сейчас в теме
(78) по идее это будет ServiceBarCodeField

НовЗП.ДополнительныеДанные.Добавить("ServiceBarCodeField","EXTRA_BARCODE_DECODED_DATA"); //в каком поле сканер возвращает штрих-код
80. Евгений Буглов (evgeny43) 5 18.01.18 13:59 Сейчас в теме
(78)
попробуй мою обработку
это у мобил байза такой интент и у хоновела похожий маунал, однако в итоге оказалось, что сам интент настраивается в настройках , а поле которое возвращается data типа srting

собери всю информацию что я писал выше и попробуй, или просто попробуй установить обработку в комментариях мою
81. Илья Жернаков (Shef_zeon) 7 22.01.18 14:50 Сейчас в теме
Спасибо
получилась такая модификация

if (BCService.TypeBarCodeField.equalsIgnoreCase("string"))
{
barcodeStr=paramIntent.getStringExtra(BCService.BarCodeField);
//"EXTRA_BARCODE_DECODED_DATA"
lng = paramIntent.getIntExtra("EXTRA_BARCODE_DECODED_SYMBOLE", -1)+1; }
else
{
byte[] barcode = paramIntent.getByteArrayExtra(BCService.BarCodeField);
lng = paramIntent.getIntExtra("length", 0);
barcodeStr = new String(barcode, 0, lng);
}
82. Николай Людмирский (ludmirsky) 23.01.18 17:17 Сейчас в теме
Дмитрий,

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

Вот в документации от Zebra написано о параметрах в Intent: http://techdocs.zebra.com/datawedge/6-2/guide/setup/#decoderelateddata

Можно ли что-то сделать, чтобы сервис заработал?

Пробовали:
НовЗП.ДополнительныеДанные.Добавить("ServiceBarCodeField","data_string");
и
НовЗП.ДополнительныеДанные.Добавить("ServiceBarCodeField","com.symbol.datawedge.data_string");
83. Artem Kolos (Rokstedi) 17 05.02.18 10:29 Сейчас в теме
Добрый день коллеги. Подскажите, все таки сканер должен работать в режиме эмуляции клавиатуры или в режиме эмуляции COM?
84. Dmitry Po (DMon) 66 05.02.18 18:15 Сейчас в теме
(83) в режиме эмуляции COM
Rokstedi; +1 Ответить
85. Artem Kolos (Rokstedi) 17 11.02.18 22:59 Сейчас в теме
(84)Сканер symbol ls2208. Подключаю к планшету через usb otg переходник. Сканер настроен в режиме cdc. Logcat молчит как партизан. Что делать?
86. Dmitry Po (DMon) 66 15.02.18 12:54 Сейчас в теме
(85) Сложно сказать не имея оборудование под рукой. Компонента для ТСД, а не внешних сканеров.
Надо только экспериментировать.
87. Александр Загребельный (hobi) 498 06.03.18 15:51 Сейчас в теме
Добрый день.
При работе с ТСД Honeywall EDA50 (Android 7.1.1) сервис вылетает с ошибкой:
'В работе приложения BarCode_to_1C' by DMondi произошел сбой.

В настройках ТСД установлены флаги:
- Scan To Intent
- Data Intent
Для Data Intent в поле Action указано: scan.rcv.message , остальные поля не заполнены
88. Dmitry Po (DMon) 66 06.03.18 20:32 Сейчас в теме
(87) Александр, на 7.1.1 не тестировалось приложение.
Чтоб отладить (или хотя бы просмотреть logcat), подходящего устройства нет, а эмулятор - совсем не вариант.

При всем желании ничем помочь не могу.
В будущем компания планирует закупить ТСД с андроид 7, но когда это будет пока не известно.
89. Александр Григорьев (hellslade) 13.03.18 13:41 Сейчас в теме
(87) У нас такой же терминал, там сканер возвращает баркод как строку, а не набор байт, как этого ожидает приложение. Надо править код.
90. Илья Пешкичев (OldthiefXXX) 150 11.05.18 10:35 Сейчас в теме
Ребят подскажите ТСД Атол Smart Droid
в настройках как уже писали тут ставлю.

НовЗП.ДополнительныеДанные.Добавить("ServiceSCAN_MESSAGE","DATA_SCAN");
1С ка ловит событие и пшет "Уведомление для неизвестного приложения 1"

Разобронное приложение демо
package com.hht.demo;

import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;

public class SDLguiActivity
  extends Activity
{
  static final Uri CONTENT_URI = Uri.parse("content://com.oem.startup.ScannerParaProvider/settings");
  static String PROPERTY_DEVICE_BEEP = "Device_Beep";
  static String PROPERTY_DEVICE_VIBRATE = "Device_Vibrate";
  static final String PROVIDER_NAME = "com.oem.startup.ScannerParaProvider";
  static final String URL = "content://com.oem.startup.ScannerParaProvider/settings";
  static SDLguiActivity app = null;
  private static TriggerThread mTriggerThread;
  private boolean beepMode = false;
  private Button buttonCodeParam;
  private Button buttonDfl;
  private Button buttonProp;
  private CheckBox chBeep = null;
  private CheckBox chVibrate = null;
  private int decodes = 0;
  private BarcodeDataBroadcastReceiver intentBarcodeDataReceiver = new BarcodeDataBroadcastReceiver(null);
  View.OnClickListener mCheckBeepListener = new View.OnClickListener()
  {
    public void onClick(View paramAnonymousView)
    {
      SDLguiActivity.this.beepMode = ((CheckBox)paramAnonymousView).isChecked();
      paramAnonymousView = new Intent();
      paramAnonymousView.setAction("com.hht.emdk.datawedge.api.ACTION_SOFTSCANTRIGGER");
      if (SDLguiActivity.this.beepMode) {
        paramAnonymousView.putExtra("com.hht.emdk.datawedge.api.EXTRA_PARAMETER", "ENABLE_BEEP");
      }
      for (;;)
      {
        SDLguiActivity.app.sendBroadcast(paramAnonymousView);
        return;
        paramAnonymousView.putExtra("com.hht.emdk.datawedge.api.EXTRA_PARAMETER", "DISABLE_BEEP");
      }
    }
  };
  View.OnClickListener mCheckVibrateListener = new View.OnClickListener()
  {
    public void onClick(View paramAnonymousView)
    {
      SDLguiActivity.this.vibrateMode = ((CheckBox)paramAnonymousView).isChecked();
      paramAnonymousView = new Intent();
      paramAnonymousView.setAction("com.hht.emdk.datawedge.api.ACTION_SOFTSCANTRIGGER");
      if (SDLguiActivity.this.vibrateMode) {
        paramAnonymousView.putExtra("com.hht.emdk.datawedge.api.EXTRA_PARAMETER", "ENABLE_VIBRATE");
      }
      for (;;)
      {
        SDLguiActivity.app.sendBroadcast(paramAnonymousView);
        return;
        paramAnonymousView.putExtra("com.hht.emdk.datawedge.api.EXTRA_PARAMETER", "DISABLE_VIBRATE");
      }
    }
  };
  View.OnClickListener mCodeSettingListener = new View.OnClickListener()
  {
    public void onClick(View paramAnonymousView)
    {
      paramAnonymousView = new Intent(SDLguiActivity.this, CodeSetting.class);
      SDLguiActivity.this.startActivity(paramAnonymousView);
    }
  };
  View.OnClickListener mDecodeListener = new View.OnClickListener()
  {
    public void onClick(View paramAnonymousView)
    {
      SDLguiActivity.StopScanner();
      SDLguiActivity.StartScanner();
    }
  };
  View.OnClickListener mDefaultListener = new View.OnClickListener()
  {
    public void onClick(View paramAnonymousView)
    {
      paramAnonymousView = new Intent();
      paramAnonymousView.setAction("com.hht.emdk.datawedge.api.ACTION_SCANNERINPUTPLUGIN");
      paramAnonymousView.putExtra("com.hht.emdk.datawedge.api.EXTRA_PARAMETER", "SET_DEFAULT_SETTING");
      SDLguiActivity.app.sendBroadcast(paramAnonymousView);
    }
  };
  View.OnClickListener mPropListener = new View.OnClickListener()
  {
    public void onClick(View paramAnonymousView)
    {
      SDLguiActivity.this.doGetProp();
    }
  };
  private TextView tvData = null;
  private TextView tvStat = null;
  private boolean vibrateMode = false;
  
  public SDLguiActivity()
  {
    app = this;
  }
  
  public static void StartScanner()
  {
    Intent localIntent = new Intent();
    localIntent.setAction("com.hht.emdk.datawedge.api.ACTION_SOFTSCANTRIGGER");
    localIntent.putExtra("com.hht.emdk.datawedge.api.EXTRA_PARAMETER", "START_SCANNING");
    app.sendBroadcast(localIntent);
  }
  
  public static void StopScanner()
  {
    Intent localIntent = new Intent();
    localIntent.setAction("com.hht.emdk.datawedge.api.ACTION_SOFTSCANTRIGGER");
    localIntent.putExtra("com.hht.emdk.datawedge.api.EXTRA_PARAMETER", "STOP_SCANNING");
    app.sendBroadcast(localIntent);
  }
  
  private void doGetProp()
  {
    AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);
    if (localBuilder != null)
    {
      localBuilder.setTitle("HHT ScanDemo");
      localBuilder.setMessage("Version 2.3\r\nCopyright 2015\t\t");
      localBuilder.setPositiveButton("ok", null);
      localBuilder.show();
    }
  }
  
  private void dspData(String paramString)
  {
    this.tvData.setText("  ");
    this.tvData.setText(paramString);
  }
  
  private void dspErr(String paramString)
  {
    this.tvStat.setText("ERROR " + paramString);
  }
  
  private void dspStat(int paramInt)
  {
    this.tvStat.setText("  ");
    this.tvStat.setText(paramInt);
  }
  
  private void dspStat(String paramString)
  {
    this.tvStat.setText(paramString);
  }
  
  private void getDeviceSetting()
  {
    Cursor localCursor = getContentResolver().query(CONTENT_URI, null, null, null, null);
    localCursor.getColumnCount();
    int i = localCursor.getCount();
    localCursor.moveToFirst();
    if (i <= 0) {
      return;
    }
    String str1 = localCursor.getString(localCursor.getColumnIndex("scanner_name"));
    String str2 = localCursor.getString(localCursor.getColumnIndex("scanner_para"));
    if (str1.equals(PROPERTY_DEVICE_BEEP)) {
      if (str2.equals("enabled"))
      {
        bool = true;
        this.beepMode = bool;
      }
    }
    while (!str1.equals(PROPERTY_DEVICE_VIBRATE)) {
      for (;;)
      {
        localCursor.moveToNext();
        i -= 1;
        break;
        bool = false;
      }
    }
    if (str2.equals("enabled")) {}
    for (boolean bool = true;; bool = false)
    {
      this.vibrateMode = bool;
      break;
    }
  }
  
  public void DisableJanamScanner()
  {
    Intent localIntent = new Intent();
    localIntent.setAction("com.hht.emdk.datawedge.api.ACTION_SOFTSCANTRIGGER");
    localIntent.putExtra("com.hht.emdk.datawedge.api.EXTRA_PARAMETER", "DISABLE_TRIGGERBUTTON");
    app.sendBroadcast(localIntent);
    localIntent = new Intent();
    localIntent.setAction("com.hht.emdk.datawedge.api.ACTION_SCANNERINPUTPLUGIN");
    localIntent.putExtra("com.hht.emdk.datawedge.api.EXTRA_PARAMETER", "DISABLE_PLUGIN");
    app.sendBroadcast(localIntent);
  }
  
  public void EnableJanamScanner()
  {
    Intent localIntent = new Intent();
    localIntent.setAction("com.hht.emdk.datawedge.api.ACTION_SCANNERINPUTPLUGIN");
    localIntent.putExtra("com.hht.emdk.datawedge.api.EXTRA_PARAMETER", "ENABLE_PLUGIN");
    app.sendBroadcast(localIntent);
    localIntent = new Intent();
    localIntent.setAction("com.hht.emdk.datawedge.api.ACTION_SOFTSCANTRIGGER");
    localIntent.putExtra("com.hht.emdk.datawedge.api.EXTRA_PARAMETER", "ENABLE_TRIGGERBUTTON");
    app.sendBroadcast(localIntent);
  }
  
  public void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    setContentView(2130903043);
    ((Button)findViewById(2131099654)).setOnClickListener(this.mDecodeListener);
    ((Button)findViewById(2131099655)).setOnClickListener(this.mCodeSettingListener);
    ((Button)findViewById(2131099657)).setOnClickListener(this.mDefaultListener);
    ((Button)findViewById(2131099658)).setOnClickListener(this.mPropListener);
    ((CheckBox)findViewById(2131099656)).setOnClickListener(this.mCheckBeepListener);
    ((CheckBox)findViewById(2131099659)).setOnClickListener(this.mCheckVibrateListener);
    getDeviceSetting();
    this.tvStat = ((TextView)findViewById(2131099652));
    this.tvData = ((TextView)findViewById(2131099653));
    this.chBeep = ((CheckBox)findViewById(2131099656));
    this.chBeep.setChecked(this.beepMode);
    this.chVibrate = ((CheckBox)findViewById(2131099659));
    this.chVibrate.setChecked(this.vibrateMode);
    this.buttonCodeParam = ((Button)findViewById(2131099655));
    this.buttonDfl = ((Button)findViewById(2131099657));
    this.buttonProp = ((Button)findViewById(2131099658));
    paramBundle = new IntentFilter("DATA_SCAN");
    registerReceiver(this.intentBarcodeDataReceiver, paramBundle);
  }
  
  public void onDecodeComplete(int paramInt1, int paramInt2, String paramString)
  {
    if (paramInt2 > 0)
    {
      this.decodes += 1;
      dspStat("[" + this.decodes + "] type: " + paramInt1 + " len: " + paramInt2);
      dspData(paramString);
      return;
    }
    dspData("");
  }
  
  protected void onPause()
  {
    DisableJanamScanner();
    super.onPause();
  }
  
  protected void onResume()
  {
    super.onResume();
    EnableJanamScanner();
  }
  
  private class BarcodeDataBroadcastReceiver
    extends BroadcastReceiver
  {
    private BarcodeDataBroadcastReceiver() {}
    
    public void onReceive(Context paramContext, Intent paramIntent)
    {
      paramContext = paramIntent.getStringExtra("com.hht.emdk.datawedge.data_string");
      int i = paramIntent.getIntExtra("com.hht.emdk.datawedge.data_type", 0);
      int j = paramIntent.getIntExtra("com.hht.emdk.datawedge.data_length", 0);
      SDLguiActivity.this.onDecodeComplete(i, j, paramContext);
    }
  }
  
  public static class TriggerThread
    extends Thread
  {
    private boolean runnable = false;
    
    public void run()
    {
      super.run();
      for (;;)
      {
        if (isInterrupted()) {
          return;
        }
        SDLguiActivity.StopScanner();
        SDLguiActivity.StartScanner();
        try
        {
          Thread.sleep(2000L);
        }
        catch (InterruptedException localInterruptedException)
        {
          Thread.currentThread().interrupt();
        }
      }
    }
    
    public void setRun(boolean paramBoolean)
    {
      this.runnable = paramBoolean;
    }
  }
}
Показать



Не могу поймать штрихкод
		НовЗП.Действие = "com.barcodeto1c.action";
		НовЗП.ДополнительныеДанные.Добавить("ServiceState","Start"); //что сделать: Старт/Стоп
		НовЗП.ДополнительныеДанные.Добавить("ServiceSCAN_MESSAGE","DATA_SCAN"); //чей бродкаст ловить
		//НовЗП.ДополнительныеДанные.Добавить("ServiceSCAN_MESSAGE","scan.rcv.message"); //чей бродкаст ловить
        НовЗП.ДополнительныеДанные.Добавить("ServiceBarCodeField","data_string"); //в каком поле сканер возвращает штрих-код (если не задавать - по умолчанию barocode, что в большинстве случаев оно так)
		НовЗП.ДополнительныеДанные.Добавить("ServiceEventID","1"); //категория сообщение для 1С
		НовЗП.ДополнительныеДанные.Добавить("ServiceToast","Service STARTED...!");//(не обязательно) просто покажет Тост при успехе
		НовЗП.ДополнительныеДанные.Добавить("ServiceBase_Name","");//если одна база - можно поставить "
91. Илья Пешкичев (OldthiefXXX) 150 11.05.18 11:09 Сейчас в теме
Все разобрался все правильно настроено.
92. Sergiu Perju (user617789_sercomp) 15.05.18 09:10 Сейчас в теме
Люди, помогите.
Не могу поймать внешнее события. ТСД Newland MT6550 в документации написано

3. Output via API: Application acquires scanned data by registering a broadcast receiver and listening for
specific broadcast intents.
 Broadcast: nlscan.action.SCANNER_RESULT
To get barcode data.
 Extra scan result 1 parameter: SCAN_BARCODE1
To get the data of the first barcode.
Type: String

мой код
НовЗП.Действие = "com.barcodeto1c.action";//com.barcodeto1c.action
		НовЗП.ДополнительныеДанные.Добавить("ServiceState","Start");
		//nlscan.action.SCANNER_RESULT 
		НовЗП.ДополнительныеДанные.Добавить("ServiceSCAN_MESSAGE","nlscan.action.SCANNER_RESULT");
                НовЗП.ДополнительныеДанные.Добавить("ServiceBarCodeField","SCAN_BARCODE1"); 
		НовЗП.ДополнительныеДанные.Добавить("ServiceEventID","1"); 
		НовЗП.ДополнительныеДанные.Добавить("ServiceToast","Service STARTED!");
		НовЗП.ДополнительныеДанные.Добавить("ServiceBase_Name",CommonDestinatieServer.GetIndentificatorInfoBase());
		Результат = НовЗП.Запустить(Истина);
Показать


Результат = 77

что я делаю не так?
93. Dmitry Po (DMon) 66 15.05.18 12:47 Сейчас в теме
(92)
что я делаю не так?


Форма, куда сканируется, имеет обработчик оповещения?

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	Если ИмяСобытия = "1" И ВводДоступен() Тогда
		ПолученШтрихКод(Параметр); //процедура для обработки ШК
	КонецЕсли;
КонецПроцедуры
94. Sergiu Perju (user617789_sercomp) 15.05.18 13:56 Сейчас в теме
Имеет.

В отлачике поставил точку остановке в процедуре ГлобальноеСобытиеОповещения. Не работает.

Ниже код SDK производителя

package com.example.scan.setting.test;

import java.util.Map;
import java.util.Random;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.TextView;

import com.nlscan.android.scan.ScanManager;
import com.nlscan.android.scan.ScanSettings;

public class MainActivity extends Activity {

	private TextView tv_broadcast_result;
	private EditText et_emulator_result;
	private RadioGroup radio_group;
	private Button btn_reset;
	
	private ScanManager mScanMgr;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mScanMgr=ScanManager.getInstance();
		initView();
	}
	
	private void initView()
	{
		tv_broadcast_result=(TextView)findViewById(R.id.tv_broadcast_result);
		et_emulator_result=(EditText)findViewById(R.id.et_emulator_result);
		radio_group=(RadioGroup)findViewById(R.id.radio_group);
		btn_reset=(Button)findViewById(R.id.btn_reset);
		btn_reset.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View view) {
				et_emulator_result.setText("");
				tv_broadcast_result.setText("广播输出的结果显示区");
				tv_broadcast_result.setTextColor(getResources().getColor(android.R.color.black));
			}
		});
		
		//可选的输出模式设置
		radio_group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
			
			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				
				int outputMode=-1;
				
				switch (checkedId) {
				
				//广播方式输出
				case R.id.radio_broadcast:
					outputMode=ScanSettings.Global.VALUE_OUT_PUT_MODE_BROADCAST;
					break;
					
				//模拟键方式输出
				case R.id.radio_emulate_key:
					outputMode=ScanSettings.Global.VALUE_OUT_PUT_MODE_EMULATE_KEY;
					break;
				
				//直接填充
				case R.id.radio_fill:
					outputMode=ScanSettings.Global.VALUE_OUT_PUT_MODE_FILLING;
					break;
				}
				
				if(outputMode!=-1)
					mScanMgr.setOutpuMode(outputMode);
			}
		});
		
		//获取所有的通用设置
		Map<String, String> settings=mScanMgr.getScanSettings();
		String sOutputMode=settings.get(ScanSettings.Global.OUT_PUT_MODE); //获取当前输出方式
		int iOutputMode=Integer.parseInt(sOutputMode);
		switch (iOutputMode) {
		case ScanSettings.Global.VALUE_OUT_PUT_MODE_BROADCAST:
			radio_group.check(R.id.radio_broadcast);
			break;
		case ScanSettings.Global.VALUE_OUT_PUT_MODE_EMULATE_KEY:
			radio_group.check(R.id.radio_emulate_key);
			break;
		case ScanSettings.Global.VALUE_OUT_PUT_MODE_FILLING:
			radio_group.check(R.id.radio_fill);
			break;
		}
		
	}
	
	private void registerReceiver()
	{
		IntentFilter intFilter;
		intFilter = new IntentFilter(ScanManager.ACTION_SEND_SCAN_RESULT);
		registerReceiver(mResultReceiver, intFilter);
	}
	
	private void unRegisterReceiver()
	{
		try {
			unregisterReceiver(mResultReceiver);
		} catch (Exception e) {
		}
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		unRegisterReceiver();
	}

	@Override
	protected void onResume() {
		super.onResume();
		registerReceiver();
	}
	
	/**
	 * 监听扫码数据的广播,当设置广播输出时作用该方法获取扫码数据
	 */
	private BroadcastReceiver mResultReceiver=new BroadcastReceiver() {
		
		@Override
		public void onReceive(Context context, Intent intent) {
			String action=intent.getAction();
			if(ScanManager.ACTION_SEND_SCAN_RESULT.equals(action)){
				byte[] bvalue1=intent.getByteArrayExtra(ScanManager.EXTRA_SCAN_RESULT_ONE_BYTES);
				byte[] bvalue2=intent.getByteArrayExtra(ScanManager.EXTRA_SCAN_RESULT_TWO_BYTES);
				String svalue1=null;
				String svalue2=null;
				try {
					if(bvalue1!=null)
						svalue1=new String(bvalue1,"GBK");
					if(bvalue2!=null)
						svalue2=new String(bvalue1,"GBK");
					svalue1=svalue1==null?"":svalue1;
					svalue2=svalue2==null?"":svalue2;
					tv_broadcast_result.setText(svalue1+"\n"+svalue2);
				} catch (Exception e) {
					e.printStackTrace();
					tv_broadcast_result.setText("data encode failed.");
				}
				
				Random random = new Random();
				tv_broadcast_result.setTextColor(Color.argb(255, random.nextInt(256),
	                    random.nextInt(256), random.nextInt(256)));
			}
		}
	};
	
}

Показать
95. Dmitry Po (DMon) 66 15.05.18 21:34 Сейчас в теме
(94) К сожалению, я не телепат. Вы можете посмотреть исходники компоненты.
У большинства работает без проблем.
96. Александр Андрющенко (anderson) 192 16.05.18 11:09 Сейчас в теме
Добрый день . Подскажите как можно отловить ошибку при отправке штрих кода в вашей компоненте в случае нескольких баз.
По вашему примеру прописываю
НовЗП.ДополнительныеДанные.Добавить("ServiceBase_Name",ОбщегоНазначенияСервер.ПолучитьИДБазы());

ИдБазы прописан из файла ibases.v8i в виде 3387edd5-2ed2-485b-a373-252980a29a08. при этом все равно выскакивает сообщение "Уведомление для неизвестного приложения "3387edd5-2ed2-485b-a373-252980a29a08".
В случае одной базы все работает прекрасно , указывая пустой ИД базы.
97. Dmitry Po (DMon) 66 16.05.18 17:41 Сейчас в теме
(96) Если делать как описано в сообщении (57) - отрабатывает корректно (по крайне мере у меня)
100. Максим Лёвочкин (frutty) 83 14.06.18 14:38 Сейчас в теме
В новой версии платформы видимо сменился идентификатор приложений, компонента перестала уведомления слать.
Оставьте свое сообщение