1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > android商户扫码枪读取手机二维码

android商户扫码枪读取手机二维码

时间:2023-09-17 15:46:28

相关推荐

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;// }//// Set<BluetoothDevice> blueDevices = mBluetoothAdapter.getBondedDevices();//// if (blueDevices == null || blueDevices.size() <= 0) {// return false;// }//// for (Iterator<BluetoothDevice> 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,否则扫码枪事件传递到屏幕其他按钮上

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。