Почему 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) работает следующее:
Каждый раз, когда вы хотите включить сканер для сканирования, выполните:
- Используйте профиль, связанный со всем вашим приложением. (не только конкретные мероприятия)
- Отключить Datawegde намеренно (и немного задержаться)
- Включите DataWedge намеренно (и немного задержитесь)
- Включить плагин сканера намеренно
При таком подходе в моем приложении не будет отключенного сканера.