从 javascript 捕获条码 reader(键盘楔)事件

Capture barcode reader (keyboard-wedge) events from javascript

我正在开发一个必须在 Honeywell Dolphin 75e 设备上使用的 Web 应用程序 运行 Android 4.4。 集成条形码 reader 可以在 "keyboard wedge" 模式下运行,但仅当文本字段具有焦点时。

通过桌面浏览器,我可以使用该代码捕获条码 reader 事件:

var BarcodesScanner = {
    barcodeData: '',
    deviceId: '',
    symbology: '',
    timestamp: 0,
    dataLength: 0
};

function onScannerNavigate(barcodeData, deviceId, symbology, timestamp, dataLength){
    BarcodesScanner.barcodeData = barcodeData;
    BarcodesScanner.deviceId = deviceId;
    BarcodesScanner.symbology = symbology;
    BarcodesScanner.timestamp = timestamp;
    BarcodesScanner.dataLength = dataLength;
    $(BarcodesScanner).trigger('scan');
}

BarcodesScanner.tmpTimestamp = 0;
BarcodesScanner.tmpData = '';
$(document).on('keypress', function(e){
    e.stopPropagation();
    var keycode = (e.keyCode ? e.keyCode : e.which);
    if (BarcodesScanner.tmpTimestamp < Date.now() - 500){
        BarcodesScanner.tmpData = '';
        BarcodesScanner.tmpTimestamp = Date.now();
    }
    if (keycode == 13 && BarcodesScanner.tmpData.length > 0){
        onScannerNavigate(BarcodesScanner.tmpData, 'FAKE_SCANNER', '', BarcodesScanner.tmpTimestamp, BarcodesScanner.tmpData.length);
        BarcodesScanner.tmpTimestamp = 0;
        BarcodesScanner.tmpData = '';
    } else if (e.charCode && e.charCode > 0) {
        BarcodesScanner.tmpData += String.fromCharCode(e.charCode);
    }
});

$(BarcodesScanner).on('scan', function(e){
    alert();
});

遗憾的是,它不适用于 Android。 是否有 API 允许我捕获这些事件? 或者其他处理此问题的浏览器?

编辑:

我能够使用文本字段作为缓冲区来拦截条形码 reader 的事件。

但在这种情况下,我不能在我的应用程序中使用任何需要焦点的控件。这是一个很大的障碍。

BarcodesScanner.tmpInput = $('<input />', {
    type: 'text',
    style: 'position: fixed; top: 0; right: 0; width: 0; height: 0;'
});
$('body').append(BarcodesScanner.tmpInput);
setInterval(function(){
    BarcodesScanner.tmpInput.focus();
}, 500);
BarcodesScanner.tmpInput.on('input', function(e){
    if (BarcodesScanner.tmpInput.val().length > 0){
        onScannerNavigate(BarcodesScanner.tmpInput.val(), 'FAKE_SCANNER', 'WEDGE', Date.now(), BarcodesScanner.tmpInput.val().length);
        BarcodesScanner.tmpInput.val('')
    }
});

您是否尝试订阅不同的元素 $('html,body') 以及可能不同的事件 keyup、keydown、textInput?

您使用 JQuery 手机还是普通手机?

我终于收到了霍尼韦尔支持的功能性回复:

I suspect that the application wants to receive the data as Keydown / Keyup events.

Can you please test the following?

On Wedge as Keys set: 9,10,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127

As it might take 15 minutes to do it manually, I have created this code that you can read inside the Wedge as keys field:

After reading the code please wait 10 seconds before saving and check if the data is correctly saved into that field by exiting and reentering the Scanner settings.

Finally, disable and re-enable the scanner (or reboot the device).

The scanner should then work on your application.

Hope this helps.

终端必须使用最新版本的系统才能看到"Wedge as keys"字段。 不要忘记将“\n”设置为后缀。

这样,JS 代码将是:

var BarcodesScanner = {
    barcodeData: '',
    deviceId: '',
    symbology: '',
    timestamp: 0,
    dataLength: 0
};

function onScannerNavigate(barcodeData, deviceId, symbology, timestamp, dataLength){
    BarcodesScanner.barcodeData = barcodeData;
    BarcodesScanner.deviceId = deviceId;
    BarcodesScanner.symbology = symbology;
    BarcodesScanner.timestamp = timestamp;
    BarcodesScanner.dataLength = dataLength;
    $(BarcodesScanner).trigger('scan');
}

BarcodesScanner.tmpTimestamp = 0;
BarcodesScanner.tmpData = '';
$(document).on('keypress', function(e){
    e.stopPropagation();
    var keycode = (e.keyCode ? e.keyCode : e.which);
    if (BarcodesScanner.tmpTimestamp < Date.now() - 500){
        BarcodesScanner.tmpData = '';
        BarcodesScanner.tmpTimestamp = Date.now();
    }
    if (keycode == 13 && BarcodesScanner.tmpData.length > 0){
        onScannerNavigate(BarcodesScanner.tmpData, 'FAKE_SCANNER', 'WEDGE', BarcodesScanner.tmpTimestamp, BarcodesScanner.tmpData.length);
        BarcodesScanner.tmpTimestamp = 0;
        BarcodesScanner.tmpData = '';
    } else if (e.charCode && e.charCode > 0) {
        BarcodesScanner.tmpData += String.fromCharCode(e.charCode);
    }
});

现在,您可以监听扫描事件了:

$(BarcodesScanner).on('scan', function(e){
    alert(BarcodesScanner.barcodeData);
});

我希望这会对其他人有所帮助。

更改键集并使用 \n 后缀适用于 Android4.4。它不适用于 Android 6.0.1。 在 Dolphin CT50 上测试...

霍尼韦尔已解决该问题,我认为您将需要此文件:HELSINKIAD_71.01.07.0050

问问霍尼韦尔,然后你通过恢复模式更新它..