Our QAE has encountered an issue that appears to happen sporadically on our Symbol TC55's running Android 4.4.3, our application is built against EMDK v3.1.
Sometimes when using the barcode scanner the round, red light that illuminates the barcode (not the scanner) gets stuck on and the actual imager stops responding to keypresses (direct calls to scanner.read()). The issue persists until we navigate back to a point where Scanner.enable() is called again, at which point both the illuminator and the imager turn themselves on (without keypress). Pressing and releasing the scan button at this point will turn both off and the scanner returns to behaving normally.
When this issue occurs - holding down the scan button (resulting in calls to Scanner.read()) repeatedly logs the following into LogCat:
08-05 10:44:42.164 E/ImagerAdapter( 1276): v4lGetFrame returned NULL
I have a suspicion that this may be a result of some kind of race condition when calls to Scanner.read() are made in quick succession. We have software logic that blacklists certain barcodes and, if a matching barcode is scanned, we ignore it and call Scanner.read() again to turn the imager back on. It appears after a few instances of this the imager locks up as described. We previously were using the DataWedge intent: com.motorolasolutions.emdk.datawedge.api.ACTION_SOFTSCANTRIGGER with START_SCANNING/STOP_SCANNING but the issue was significantly more common that way.
Below is a little more context on how our application is setup:
- From onResume() of our first Activity we initialize EMDKManager. We retain one reference to it that our app uses across all activities via a singleton (I'll refer to as TC55ScanManager) as it doesn't make sense to constantly throw these references away and cause GC churn.
- In TC55ScanManager.onOpened(EMDKManager), we get the BarcodeManager and then the Scanner from barcodeManager.getDevice(BarcodeManager.DeviceIdentifier.INTERNAL_IMAGER1). The first thing we do is set scanner.triggerType = Scanner.TriggerType.SOFT_ALWAYS - our app listens to keypresses and invokes scanner.read() / scanner.cancelRead() accordingly (consequently, if anyone could point us to documentation about how TriggerType can be configured via EMDKConfig.xml it would be greatly apprectiated).
- Then in TC55ScanManager.onOpened(EMDKManager), we process our profile from /assets/EMDKConfig.xml (attached). For our usecase we use dedicated devices and intend for only our app to used; for this reason we set this profile as the default profile via the com.motorolasolutions.emdk.datawedge.api.ACTION_SETDEFAULTPROFILE intent. Some key configuration choices:
- We use Intent delivery via startService(): <parm name="intent_delivery" value="1"/>
- Our intent is received by an IntentService and then passed on to be processed by the app
- All other settings are just copy-pasted from the code sample from this tutorial: Using Broadcast Intent in DataCapture Profiles
This issue is blocking our migration to these devices, any assistance would be greatly appreciated.