Android service перехвата сообщений Broadcast со сканера штрих-кодов в 1С

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

Внешнее событие Штрих-код сервис Broadcast Мобильное приложение Service

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

Более новая версия (продолжение) тут

Предыстория аналогична как //xn--80appelehcm.xn--p1ai/public/579674/ Спасибо за идеи Meteorage

Закупили КПК Caribe PL-40. Не плохой такой девайс. Написали на него мобильное приложение для складского учета. Вот только сканировал он в разрыв клавиатуры и в 1С постоянно приходилось тапать в окно для ввода штрих-кода. Было перепробовано много способов победить данный недуг. В частности и  //xn--80appelehcm.xn--p1ai/public/547851/ (спасибо автору dewersia ). Смотрели ACode tools. Он не работает (на сколько мне известно) со сторонними КПК и тем более со встроенными сканерами. Конечно, был получен неоценимый опыт изучая его код (за что огромное спасибо автору DitriX).

Возможности сервиса:

  1. Автостарт после загрузки КПК (OnBootReceiver);
  2. Старт/Стоп сервиса в интерфейсе приложения;
  3. Назначение "имени сообщения" от сканера. У разных КПК они различаются. К примеру, у нашего это "scan.rcv.message", у Urovo - "urovo.rcv.message". Нужно конкретно знать какое сообщение от сканера выдается бродкастом на конкретном аппарате.
  4. Назначение "1C Event ID". Это как раз тот эвент, по которому 1С будет определять что это прилетел к ней Штрих-код. По-умолчанию это 1.
  5. Назначение "1C Base ID". Используется если в списке выбора баз более одной базы. Если только одна - оставить поле пустым. Идентификатор брать с файла ibases.v8i.

В мобильном приложении обязательно должна быть инициализация приема внешних сообщений (Пример из ACode tools):

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

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

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


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

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

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

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

Таким образом у нас получают Штрих-код все формы, у которых описана ОбработкаОповещения. Для получения ШК только в активную форму используем метод управляемой формы ВводДоступен()

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

Кому интересно, процесс передачи со стороны Android описан так:

public void onReceive(Context context, Intent intent) {
        byte[] barcode = intent.getByteArrayExtra("barocode");
        int lng = intent.getIntExtra("length", 0);
        this.barcodeStr = new String(barcode, 0, lng);
        if (lng > 0) {
            Intent intentFor1C = new Intent("com.google.android.c2dm.intent.RECEIVE");
            intentFor1C.putExtra("text", BCService.EventID);
            intentFor1C.putExtra("title", "1C");
            intentFor1C.putExtra("data", this.barcodeStr);
            if (BCService.BaseName != null || BCService.BaseName != "")  {
                intentFor1C.putExtra("base", BCService.BaseName);
            }
            context.sendBroadcast(intentFor1C);
        }
    }

 

Ну, в принципе, и всё. Сервис писался "для себя" и распространяется "как есть". Буду рад, если кому пригодится!

19

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

Наименование Файл Версия Размер
BarCodeTo1C.apk
.apk 645,65Kb
09.02.17
56
.apk 1.0 645,65Kb 56 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Tahallus 421 09.02.17 12:57 Сейчас в теме
Исходники на GitHub будете выкладывать ?
2. DMon 79 09.02.17 13:16 Сейчас в теме
(1) Скорее всего нет. Делалось не для широкой публики.
3. DrinkMaster 6 21.03.17 11:46 Сейчас в теме
Установил APK на urovo v5100, но кроме сообщения "Hello World!" и кнопок Start\Stop service на экране ничего нет. Как в этом случае выставить параметры "имени сообщения" от сканера, "1C Event ID" и "1C Base ID"?
4. DMon 79 22.03.17 00:53 Сейчас в теме
(3) Специально с сайта переустановил apk. Там нет никакого "Hello world!" и всё работает.
И как Вы могли её установить, если даже не скачивали?
А вообще актуальная APK - http://infostart.ru/public/587908/
5. DrinkMaster 6 22.03.17 10:29 Сейчас в теме
(4) Вот
Прикрепленные файлы:
6. DMon 79 22.03.17 15:04 Сейчас в теме
(5) Очень странно. А версия андроид случайно не ниже 4.4?
Если да - то минимальная в СДК установлена 4.4 и на версиях ниже не тестировалась (поведение неизвестно).
7. DrinkMaster 6 23.03.17 09:16 Сейчас в теме
8. Bru_10 24.04.17 16:20 Сейчас в теме
Подскажите как можно определить это имя сообщения "scan.rcv.message"?
9. DMon 79 25.04.17 08:12 Сейчас в теме
(8)можно через logcat. Можно разобрать сервисную апк по настройке сканера и просмотреть там IntentFilter.
10. d_sdr 4 05.06.17 15:34 Сейчас в теме
подскажите, в процедуре "ПодключитьГлобальноеСобытиеОповещения" вызывается такая интересная вещь, как
ДоставляемыеУведомления.ПодключитьОбработчикУведомлений(...)

Что это за модуль - "ДоставляемыеУведомления" и где его достать? В типовых конфигурациях его не нашёл, в ACode Tools тоже нету.
11. DMon 79 05.06.17 19:09 Сейчас в теме
12. demONx7 29.06.17 03:10 Сейчас в теме
(0) Подскажите, как можно перехватить нажатие кнопок на тсд? Интересуют стрелки, цифры и клавиши F..
На данный момент при тестировании на компьютере все работает, а на ТСД нет. Полагаю что нужно где-то эти самые нажатия "поймать"
13. DMon 79 30.06.17 07:18 Сейчас в теме
(12) Подключаем устройство к Adroid студии, открываем вкладку событий и жмем по клавишам. В списке видим что был такой-то keyPressed, keyReleased. Далее что с этим делать - Ваша фантазия
14. Tiger77 65 08.07.17 20:50 Сейчас в теме
(13) Доработаете пожалуйста сервис - чтобы можно было менять название поля в котором находится штриход. В нашем случаем служба "вылетает"
Стандартно штрихкод содержится в поле "barcode", но наш сканер присылает штрихкод в поле "SCAN_BARCODE1".
15. DMon 79 09.07.17 00:19 Сейчас в теме
(14) Не плохая идея. Как только разгребусь с текущей загрузкой - сделаю!
16. mxs89 3 31.08.17 20:23 Сейчас в теме
ошибка при синтаксическом анализе! чувствую себя обманутым!
17. DMon 79 31.08.17 21:10 Сейчас в теме
(16) очень информативно, сейчас попробую угадать...
18. mxs89 3 01.09.17 09:18 Сейчас в теме
я новую версию скачал, буду пробовать ее, но спасибо за отзыв
19. Dimitrij 25.09.17 14:54 Сейчас в теме
День добрый.

У нас ТСД работает через веб клиент на андроиде. Браузер хром.

Данное преспосабление будет работать через веб клиент?

Заранее спасибо!
20. DMon 79 25.09.17 20:37 Сейчас в теме
21. Dimitrij 26.09.17 11:08 Сейчас в теме
(20) У Вас случаем нет решений по моей проблеме?
22. DMon 79 26.09.17 12:21 Сейчас в теме
(21) Мобильный клиент слушает бродкаст от утилиты. Я не знаю как браузер Хром научить слушать бродкаст.
Возможно это как-то и делается, но я с таким не сталкивался.
23. evgeny43 5 18.12.17 14:06 Сейчас в теме
А только утилита может отправить в бродкаст?У меня тсд honeywell , в меню сканирования есть раздел scan to intent, я прописал согласно маунала имя интента в хмл платформы , и ничего .... платформа ( 8.3.9.91 мобильная)
24. Широкий 685 30.01.18 15:31 Сейчас в теме
ИдБазыДанных=Прав(ПолучитьНавигационнуюСсылкуИнформационнойБазы(),36);
Danil.Potapov; +1 Ответить
25. IgorKissil 134 05.02.18 10:36 Сейчас в теме
Не пытались ли Вы использовать: https://infostart.ru/public/595292/ ? Чип сканера у устройств общий и я знаю об одном успешном применении компоненты на Caribe
26. Lupeykin 29.06.18 02:27 Сейчас в теме
8.3.10.51 работает Intent intentFor1C = new Intent("com.google.android.c2dm.intent.RECEIVE");
8.3.12.67 в этом релизе такой номер уже не прокатывает.
27. DMon 79 30.06.18 10:24 Сейчас в теме
(26) Вскоре у нас планируется переход на платформу 12-ю, задача станет более актуальной и возможно получится переделать под особенности новые. Результат выложу на форум. Но пока "как есть"
28. menen 12.07.18 12:41 Сейчас в теме
Дмитрий, добрый день!

Для публикации https://infostart.ru/public/704582/ Вы, как я понял, немного изменили драйвер перехвата.

На основании той же публикации я сделал мобильное приложение, но столкнулся с такой проблемой (цитирую):

=========
На базе Вашей обработки сделали конфигурацию под мобильное приложение (ТСД MobileBase DSIC 5 - обновили до Андроид 6) .

Конфигурация работала через мобильную платформу 1С на ТСД.

Драйвер перехвата работал относительно хорошо (иногда, после работы со встроенной программой ТСД, на одно чтение ШК выдавал в тестовую таблицу прочитанный штрихкод несколько раз (причем по нарастающей )- решалось перезагрузкой ТСД).

После сборки конфигурации в самостоятельное мобильное приложение начались проблемы: 1С перестала получать от драйвера перехвата значения.
Сообщения отладчика драйвера показывают, что он нормально получает (get valid intent data ...) сканированное значение ШК, но в мобильном приложении не срабатывают Оповещения.

Снова запускаю конфигурацию 1С через мобильное приложение 1С - Оповещения срабатывают.

Пробовали варианты - сносили с ТСД Мобильную платформу 1С, устанавливали только собранное мобильное приложение - результат тот же.

Такое подозрение, что в драйвере перехвата где-то есть жесткая привязка ...
=====

Вы можете чем-то помочь?
29. DMon 79 12.07.18 15:39 Сейчас в теме
(28) С такой ситуацией не сталкивался. "Внутри" всё просто: слушать одно, если подходит по данным - передать дальше. Там кода на 20 строчек. К сожалению, без устройства ничем помочь не смогу.
32. ShalamovEV 28.08.18 09:36 Сейчас в теме
(28) Ситуация один в один. Сервис отправляет оповещение в Мобильную платформу, а в собранное приложение не хочет. Вам удалось как то решить вопрос?
33. menen 04.09.18 12:20 Сейчас в теме
(32) Проблему так и не решил
30. menen 18.07.18 14:01 Сейчас в теме
Дмитрий, я приобрел на Инфостарте https://infostart.ru/public/587908/ ваши исходники.

Чтобы уже копать самостоятельно, можете выслать исходники (на почту), которые вы сделали для https://infostart.ru/public/704582/
31. DMon 79 18.07.18 14:56 Сейчас в теме
(30) День добрый!
Но они именно такие, которые выложены на инфостарте и доступны к скачиванию. Других нет.
34. KBNIKKB 20.11.18 07:32 Сейчас в теме
"ПолученШтрихКод(Параметр) " Эта процедура что делает?
35. DMon 79 20.11.18 10:26 Сейчас в теме
(34) Обрабатывает полученный ШтрихКод, который передан в Параметр.
Мне эту процедуру описывать нет смысла, так как у каждого она своя.
36. KBNIKKB 20.11.18 10:55 Сейчас в теме
(35) Если рассматривать по-шагово, то будет примерно так ?
Прикрепленные файлы:
37. DMon 79 20.11.18 10:59 Сейчас в теме
(36) Примерно да. В конце можно не "сообщить что-то там", а Параметр. В нем должен быть ШК.
но это предыдущий вариант компоненты
более новый тут https://infostart.ru/public/587908/
38. KBNIKKB 20.11.18 11:02 Сейчас в теме
(37) А процедуры из "ОбщийМодульСобытие" мне от куда нужно вызывать ?
39. KBNIKKB 26.11.18 11:52 Сейчас в теме
Еще вопрос, какие настройки нужно сделать на ТСД ?
40. DMon 79 26.11.18 12:00 Сейчас в теме
(39) В ветке полно информации. Как минимум сканирование НЕ в разрыв клавиатуры
Оставьте свое сообщение