Приложение на ТСД и связь с 1С: Предприятие 8.3 через HTTP-Сервис. Часть 4 (OnKeyUp. Сканер ШК с эмуляцией клавиатуры)

  • Tutorial
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)
    }

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

Подробнее
Реклама

Комментарии 1

    0
    Пробовали мы подход с завязыванием на хардварные кнопки сканера. Как только третью библиотеку пришлось зашивать в приложение, то передумали. Устройств много и много китайских — там никакой стандартизации и рядом нет. А есть же еще блютусные сканеры, которые вообще не посылают нажатия клавиш.
    Сейчас используем вариант с бродкаст ресивером который по имени устройства при старте настраивается под то приложение, которое производитель предустановил. Где поддерживается там и сканер соответствующим интентом настраиваем.
    Идея в том, что если скан нельзя через бродкаст отлавливать, но можно через библиотеку все же данные получать, то можно эту библиотеку вынести в другое приложение, которое уже будет нашему основному слать бродкасты. Вот в таких приложения-спутниках можно какой угодно зоопарк библиотек держать. Поддерживать проще, качать библиотеки от chainway в ТСД Honewell не надо — profit.

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое