1. Выбор способа обмена. Описание API.
2. Реализация API на стороне 1С.
3. BroadcastReceiver. Получаем данные
4. OnKeyUp. Сканер ШК с эмуляцией клавиатуры
Эта статья должна была стать самой короткой. Но дьявол в деталях. Вот несколько фактов.
Факт 1. Если у нас на форме есть несколько полей EditText
, и для всех мы переопределим OnKeyListener
, то onKeyUp и onKeyDown затеняются и больше не вызываются. Код.
class MainActivity : AppCompatActivity() {
var keyListener: View.OnKeyListener = View.OnKeyListener { _, _, _ ->
true}
override fun onCreate(savedInstanceState: Bundle?) {
val editBarcode = findViewById(R.id.editBarcode)
editBarcode.setOnKeyListener (keyListener)
val editQuantity: EditText = findViewById(R.id.editQuantity)
editQuantity.setOnKeyListener(keyListener)
Из этого следует
Факт 2. onKeyUp
и onKeyDown
срабатывают только для тех полей, для которых не переопределен OnKeyListener. И только при нахождении в данном поле.
Факт 3. АТОЛ Lite.Droid в версии 1.1.1 не передает KeyEvent = KEYCODE_TAB если он выставлен в качестве префикса. Ни в префикс1, ни в префикс2. В суффикс я его не пробовал. Он там не нужен.
Факт 4. onKeyUp, onKeyDown, setOnKeyListener — слушают только аппаратные нажатия. Клавиатура, сканер с эмуляцией клавиатуры, и как ни странно, кнопка «назад» на экране, это тоже аппаратная кнопка («KEYCODE_BACK»). А цифровые кнопки(физические) на ТСД это — программные кнопки. Почему так, я не понял :) Ну да ладно.
Теперь немного теории.
Есть встроенные сканеры ШК которые не могут отправлять Broadcast. А есть сканеры ШК с эмуляцией клавиатуры. Думаю для них данный способ тоже подойдет. В обоих случаях я советую выставить «префикс» например равный"="(KEYCODE_EQUALS)
. И заменить суффикс на "CR"(KEYCODE_ENTER)
. Все остальные суффиксы и префиксы убрать. Большинство сканеров с эмуляцией клавиатуры в стандартных настройках не имеют префикса, но при этом с радостью отдают CRLF
(Два символа. Перевод каретки, перенос строки). Видать исторически так сложилось.
Теперь сама реализация. В классе MainActivity создаем две переменных. Первая отвечает за конкатенацию символов ШК, вторая за то, чтобы штрих код собрался в строку между префиксом и суфиксом.
val barcodeStringBuilder = StringBuilder()
var isReadingBarcode = false
А в классе нужно переопределить функцию onKeyUp
.
override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
//Поймали символ, начала ШК(Префикс). Очистили переменную ШК. Взвели переменную что вот прям от сюда начинается штрихкод.
if (event?.keyCode == KeyEvent.KEYCODE_EQUALS ){
barcodeStringBuilder.clear()
isReadingBarcode = true
return true
}
//Проверили что мы слушаем штрих код. Если да, то добавляем символы в переменную ШК.
if (isReadingBarcode) {
barcodeStringBuilder.append(event?.getUnicodeChar()?.toChar())
}
//Поймали суффикс ШК и проверили, что мы в режиме прослушки ШК. Дальше с ШК можем делать что хотим.
if ((event?.keyCode == KeyEvent.KEYCODE_ENTER) && isReadingBarcode) {
Log.d("BarcodeDebug", "$barcodeStringBuilder")
setTextBarcode(barcodeStringBuilder.toString())
//Завершили цикл прослушки. Обрабатываем дальше как обычно.
isReadingBarcode = false
return true
}
//Во всех остальных случаях стандартное поведение.
return super.onKeyUp(keyCode, event)
}
На этом все. Как всегда комментарии и дополнения приветствуются.
Автор: loki82
Добрый день!
Будьте добры, помогите с пониманием…
на ТСД установлена 1С, которая работает в связки с УТ.
Для инвентаризации ТСД руководство поставило задачу получить средствами 1С серийный номер ТСД. Так понимаю, что нужно выполнить скрипт с 1С прям. Но нигде описания не могу найти КАК это сделать. Потом эта инф должна передаться в УТ средствами HTTP-сервиса. Вот как вытащить серийник не нашел в Инете.
С уважением, Юрий. y.batiaev@mail.ru