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

в 16:10, , рубрики: api, kotlin, onKeyUp, Разработка под android, Сканер ШК

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С серийный номер ТСД. Так понимаю, что нужно выполнить скрипт с 1С прям. Но нигде описания не могу найти КАК это сделать. Потом эта инф должна передаться в УТ средствами HTTP-сервиса. Вот как вытащить серийник не нашел в Инете.
    С уважением, Юрий. y.batiaev@mail.ru

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js