Почему Zebra InputScannerPlugin перестает реагировать на отправленные трансляции?

Я создаю Android APK на ZEBRA MC3300 - на этом устройстве предустановлен DataWedge, в моем приложении я использую Zebra InputScannerPlugin для отключения / включения сканера в зависимости от активности. У меня есть код для отключения / включения методов из руководства Zebra, это выглядит так:

    static String scannerInputPlugin = "com.symbol.datawedge.api.ACTION";
    static String extraData = "com.symbol.datawedge.api.SCANNER_INPUT_PLUGIN";

public static void enableScanner(Activity activity){
        try {            
            if(!scannerEnabled) {
                Intent i = new Intent();
                i.setAction(scannerInputPlugin);
                i.putExtra(extraData, "ENABLE_PLUGIN");
                activity.sendBroadcast(i);
            }
            scannerEnabled = true;
        }catch(Exception e){
            Log.d("TERMINALPROP", e.toString());
        }
}
public static void disableScanner(Activity activity){
        try {            
            if(!scannerEnabled) {
                Intent i = new Intent();
                i.setAction(scannerInputPlugin);
                i.putExtra(extraData, "DISABLE_PLUGIN");
                activity.sendBroadcast(i);
            }
            scannerEnabled = true;
        }catch(Exception e){
            Log.d("TERMINALPROP", e.toString());
        }
}

Я использую disableScanner и enableScanner в методах onResumie, и он работает нормально, но я также использую их в своем AsyncTask в методах onPreExecute и onPostExecute.

Иногда у меня возникают проблемы с тем, что мой сканер не реагирует на включение / отключение. Похоже, среда выполнения datawedge перестает работать, я посылаю туда трансляцию и ничего не меняется - сканер остается отключенным, но это происходит не каждый раз.

Мне удалось воссоздать проблему несколько раз. Это выглядит так:

У меня есть активность A и B. При действии A в методе onResumie я отключаю сканер, перед тем как начать действие B, я использую AsyncTask (он отключается при preExecute и включает Scanner в postExecute), и я переключаюсь в действие B и там Метод onResume я снова вызываю enableScanner.

И если я переключаю действия очень быстро, иногда мой сканер остается отключенным и перестает реагировать на все мои вызовы enableScanner. Это происходит случайно, иногда после 3-х переключений активности, иногда приходится переключать его 20 раз и т. Д.

Есть идеи, что я делаю не так?

@EDIT Это, вероятно, что-то с плагином Datawedge InputScanner - (я удалил if(! ScannerEnabled) из методов) и просто добавил коды результатов в мой apk, и когда сканер "заблокирован", он возвращает мне SCANNER_ALREADY_ENABLED, когда я вызываю enableScanner, но сканер отключен:/

1 ответ

Если вы никогда не хотите, чтобы сканер был активирован в Деятельности A, создайте новый профиль DataWedge, свяжите его с Деятельностью A и отключите плагин для ввода штрих-кода. У вас будет другой профиль, связанный с Деятельностью B, с включенным плагином для ввода штрих-кода. Затем вы можете удалить всю логику кода вокруг включения / выключения сканера, когда какое-либо действие получает фокус, поскольку DataWedge будет обрабатывать это автоматически.

Я заметил такое же поведение с DataWedge с небольшими различиями между версиями.

  • 6.7 полностью перестанет отправлять широковещательные события или заметит кнопку запуска на моем TC20.
  • 6.6 остановится только на определенное время. Также может работать переключение приложений / занятий.

Я обнаружил, что (по крайней мере, в версии 6.7.47) работает следующее:

Каждый раз, когда вы хотите включить сканер для сканирования, выполните:

  1. Используйте профиль, связанный со всем вашим приложением. (не только конкретные мероприятия)
  2. Отключить Datawegde намеренно (и немного задержаться)
  3. Включите DataWedge намеренно (и немного задержитесь)
  4. Включить плагин сканера намеренно

При таком подходе в моем приложении не будет отключенного сканера.

Другие вопросы по тегам