【问题标题】:Capture barcode reader (keyboard-wedge) events from javascript从 javascript 捕获条形码阅读器(键盘楔形)事件
【发布时间】:2016-02-14 03:23:59
【问题描述】:

我正在开发一个必须在运行 Android 4.4 的 Honeywell Dolphin 75e 设备上使用的网络应用程序。 集成的条形码阅读器可以在“键盘楔”模式下运行,但仅限于文本字段具有焦点时。

使用桌面浏览器,我可以使用该代码来捕获条形码阅读器事件:

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 允许我捕获这些事件? 或者其他可以处理这个问题的浏览器?

编辑:

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

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

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('')
    }
});

【问题讨论】:

    标签: javascript android barcode-scanner honeywell keyboard-wedge


    【解决方案1】:

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

    我怀疑应用程序希望以 Keydown / 的形式接收数据 按键事件。

    你能测试一下吗?

    在楔形键设置: 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, 801,111.110101011 ,11.117,101010101017,11711.117,117,117,2117,1010101010101010101017117,2105101710101010151015101510151015101510515

    因为手动操作可能需要 15 分钟,所以我创建了这个 您可以在 Wedge 中读取的代码作为键字段:

    阅读代码后请等待10秒再保存并检查 如果数据通过退出正确保存到该字段中,并且 重新进入扫描仪设置。

    最后,禁用并重新启用扫描仪(或重启设备)。

    然后扫描仪应该在您的应用程序上工作。

    希望这会有所帮助。

    终端必须使用最新版本的系统才能看到“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);
    });
    

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

    【讨论】:

    • 感谢您的分享,这是很棒的东西,我正在研究同样的事情。但是,在我的应用程序中,每次我进行扫描时都会显示键盘。这也发生在你身上吗?关于如何摆脱它的任何建议?
    • 通常,键盘仅显示在输入字段上,那么您是使用此答案中公开的捕获解决方案还是原始问题编辑中的文本字段缓冲区?您可以使用 Null Keyboard (play.google.com/store/apps/…) 等应用程序将其停用。你的设备是什么?
    • 对于没有“Wedge 作为密钥”选项的 Dolphin 75e 用户,您需要联系霍尼韦尔支持以获取最新固件,因为由于许可问题,该固件在他们的网站上不可用。相关文件为PARISAD_56.01.13.0173.zip
    【解决方案2】:

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

    你是使用 JQuery 移动版还是普通版?

    【讨论】:

    • 我正在使用 JQuery 正常。我可以将条形码事件捕获为文本字段上的“输入”事件,但不能捕获正文。
    • 我的办公桌上有 2 台扫描仪(二维/条形码和信用卡),正在为信息亭开发几页。您的代码在我的 win7+chrome 上都适用于它们。我试过 document.addEventListener("tap", function(e){alert(e)});在我的 SG s5 上 - 工作正常。尽管我订阅了 document.addEventListener("keydown",...)),但也捕获了 android 键盘事件 (document.addEventListener("keydown",...))。我会尝试连接蓝牙键盘以检查您是否可以捕获它,因此这意味着扫描仪不能用作键盘。
    • 只有在输入字段获得焦点时,扫描仪才会作为键盘工作。
    【解决方案3】:

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

    【讨论】:

    • 我将在 10 天内收到 2 台搭载 Android 6.0 的 Dolphin 75e,所以我会告诉你它是否有效。
    • 我们的 Android 6.0 设备的版本号为:71.01.04.0015。 hsm.force.com/publickb/articles/HSM_Article/…我在霍尼韦尔网站上没有找到版本 71.01.07.0050
    【解决方案4】:

    霍尼韦尔已经解决了这个问题,我认为你需要这个文件:HELSINKIAD_71.01.07.0050

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

    【讨论】:

    • 您可以编辑原始答案,而不是编写多个答案。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2012-01-27
    • 2014-07-10
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    相关资源
    最近更新 更多