1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
package com.miya.fastcashier.util
import android.os.Handler
import android.text.TextUtils
import android.view.KeyEvent
/**
* 扫码枪解码器
* Created by fengyu on 2018/1/12.
*/
class ScanGunKeyEventHelper {
//扫码内容
private val mStringBufferResult = StringBuffer()
//大小写区分
private var mCaps = false
private var mOnScanSuccessListener: OnScanSuccessListener? = null
private val mHandler = Handler()
private val mScanningFishedRunnable = Runnable { performScanSuccess() }
//返回扫描结果
private fun performScanSuccess() {
val barcode = mStringBufferResult.toString()
if (mOnScanSuccessListener != null && !TextUtils.isEmpty(barcode)) mOnScanSuccessListener!!.onScanSuccess(
barcode
)
mStringBufferResult.setLength(0)
}
//key事件处理
fun analysisKeyEvent(event: KeyEvent) {
val keyCode = event.keyCode
//字母大小写判断
checkLetterStatus(event)
if (event.action == KeyEvent.ACTION_DOWN) {
val aChar = getInputCode(event)
if (keyCode == KeyEvent.KEYCODE_ENTER) {
//若为回车键,直接返回
mHandler.removeCallbacks(mScanningFishedRunnable)
mHandler.post(mScanningFishedRunnable)
} else {
if (aChar.toInt() != 0) {
mStringBufferResult.append(aChar)
}
//延迟post,若500ms内,有其他事件
mHandler.removeCallbacks(mScanningFishedRunnable)
mHandler.postDelayed(mScanningFishedRunnable, MESSAGE_DELAY)
}
}
}
//检查shift键
private fun checkLetterStatus(event: KeyEvent) {
val keyCode = event.keyCode
if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT || keyCode == KeyEvent.KEYCODE_SHIFT_LEFT) {
//true为按下shift键,表示大写
mCaps = (event.action == KeyEvent.ACTION_DOWN)
}
}
//获取扫描内容
private fun getInputCode(event: KeyEvent): Char {
val keyCode = event.keyCode
val aChar: Char
aChar =
if (keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z) {
//字母
((if (mCaps) 'A' else 'a').toInt() + keyCode - KeyEvent.KEYCODE_A).toChar()
} else if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {
//数字
('0'.toInt() + keyCode - KeyEvent.KEYCODE_0).toChar()
} else {
//其他符号
when (keyCode) {
KeyEvent.KEYCODE_PERIOD -> '.'
KeyEvent.KEYCODE_MINUS -> if (mCaps) '_' else '-'
KeyEvent.KEYCODE_SLASH -> '/'
KeyEvent.KEYCODE_BACKSLASH -> if (mCaps) '|' else '\\'
else -> 0.toChar()
}
}
return aChar
}
interface OnScanSuccessListener {
fun onScanSuccess(barcode: String?)
}
fun setOnBarCodeCatchListener(onScanSuccessListener: OnScanSuccessListener?) {
mOnScanSuccessListener = onScanSuccessListener
}
fun onDestroy() {
mHandler.removeCallbacks(mScanningFishedRunnable)
mOnScanSuccessListener = null
}
companion object {
//延迟500ms,判断扫码是否完成。
private const val MESSAGE_DELAY: Long = 500
}
}