android商户扫码枪读取手机二维码
扫码抢实现读取二维码信息,本地扫码枪是外接写入设备,本质是监控读写输入,下面介绍下扫码设备读取支付二维码。
1.引入扫码设备辅助类
public class ScanGunKeyEventHelper { private final static long MESSAGE_DELAY = 500; //延迟500ms,判断扫码是否完成。private StringBuffer mStringBufferResult; //扫码内容private boolean mCaps; //大小写区分private final Handler mHandler; private final BluetoothAdapter mBluetoothAdapter; private final Runnable mScanningFishedRunnable; private OnScanSuccessListener mOnScanSuccessListener; private String mDeviceName; public ScanGunKeyEventHelper(OnScanSuccessListener onScanSuccessListener) {mOnScanSuccessListener = onScanSuccessListener ; mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mStringBufferResult = new StringBuffer(); mHandler = new Handler(); mScanningFishedRunnable = new Runnable() {@Overridepublic void run() {performScanSuccess(); }}; } /*** 返回扫码成功后的结果*/private void performScanSuccess() {String barcode = mStringBufferResult.toString(); if (mOnScanSuccessListener != null)mOnScanSuccessListener.onScanSuccess(barcode); mStringBufferResult.setLength(0); } /*** 扫码枪事件解析* @param event*/public void analysisKeyEvent(KeyEvent event) { int keyCode = event.getKeyCode(); //字母大小写判断checkLetterStatus(event); if (event.getAction() == KeyEvent.ACTION_DOWN) { char aChar = getInputCode(event); ; if (aChar != 0) {mStringBufferResult.append(aChar); } if (keyCode == KeyEvent.KEYCODE_ENTER) {//若为回车键,直接返回mHandler.removeCallbacks(mScanningFishedRunnable); mHandler.post(mScanningFishedRunnable); } else {//延迟post,若500ms内,有其他事件mHandler.removeCallbacks(mScanningFishedRunnable); mHandler.postDelayed(mScanningFishedRunnable, MESSAGE_DELAY); } }}//检查shift键private void checkLetterStatus(KeyEvent event) {int keyCode = event.getKeyCode(); if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT || keyCode == KeyEvent.KEYCODE_SHIFT_LEFT) {if (event.getAction() == KeyEvent.ACTION_DOWN) {//按着shift键,表示大写mCaps = true; } else {//松开shift键,表示小写mCaps = false; }}} //获取扫描内容private char getInputCode(KeyEvent event) { int keyCode = event.getKeyCode(); char aChar; if (keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z) {//字母aChar = (char) ((mCaps ? 'A' : 'a') + keyCode - KeyEvent.KEYCODE_A); } else if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {//数字aChar = (char) ('0' + keyCode - KeyEvent.KEYCODE_0); } else {//其他符号switch (keyCode) {case KeyEvent.KEYCODE_PERIOD:aChar = '.'; break; case KeyEvent.KEYCODE_MINUS:aChar = mCaps ? '_' : '-'; break; case KeyEvent.KEYCODE_SLASH:aChar = '/'; break; case KeyEvent.KEYCODE_BACKSLASH:aChar = mCaps ? '|' : '\\'; break; default:aChar = 0; break; }} return aChar; } public interface OnScanSuccessListener {void onScanSuccess(String barcode); } public void onDestroy() {mHandler.removeCallbacks(mScanningFishedRunnable); mOnScanSuccessListener = null; } //部分手机如三星,无法使用该方法//private void hasScanGun() {//Configuration cfg = getResources().getConfiguration(); //return cfg.keyboard != Configuration.KEYBOARD_NOKEYS; //} ///**//* 扫描枪是否连接//* @return//*///public boolean hasScanGun() {////if (mBluetoothAdapter == null) {//return false; //}////SetblueDevices = mBluetoothAdapter.getBondedDevices(); ////if (blueDevices == null || blueDevices.size() <= 0) {//return false; //}////for (Iterator iterator = blueDevices.iterator(); iterator.hasNext(); ) {//BluetoothDevice bluetoothDevice = iterator.next(); ////if (bluetoothDevice.getBluetoothClass().getMajorDeviceClass() == BluetoothClass.Device.Major.PERIPHERAL) {//mDeviceName = bluetoothDevice.getName(); //return isInputDeviceExist(mDeviceName); //}////}////return false; ////} /*** 输入设备是否存在* @param deviceName* @return*/private boolean isInputDeviceExist(String deviceName) {int[] deviceIds = InputDevice.getDeviceIds(); for (int id : deviceIds) {if (InputDevice.getDevice(id).getName().equals(deviceName)) {return true; }}return false; } /*** 是否为扫码枪事件(部分机型KeyEvent获取的名字错误)* @param event* @return*/@Deprecatedpublic boolean isScanGunEvent(KeyEvent event) {return event.getDevice().getName().equals(mDeviceName); } }
2. active里面实现代理方法
//实现上述类接口‘public class MainActivity extends AppCompatActivity implementsScanGunKeyEventHelper.OnScanSuccessListener//重写扫码枪识别返回数据@Overridepublic void onScanSuccess(String barcode) { barCode = barcode; if (barcode != null && recordPrice > 0 && payString.equals("readyPay")) {payDishs(); }} //重写捕捉到扫码枪事件@Overridepublic boolean dispatchKeyEvent(KeyEvent event) { mScanGunKeyEventHelper.analysisKeyEvent(event); return true; }
dispatchKeyEvent里面分发事件一定设置 return true,否则扫码枪事件传递到屏幕其他按钮上
【android商户扫码枪读取手机二维码】以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)
- Android|Android install 多个设备时指定设备