日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android设备获取USB扫码枪扫描的内容与可能遇到的问题解决

發(fā)布時間:2024/1/18 Android 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android设备获取USB扫码枪扫描的内容与可能遇到的问题解决 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這篇文章主要給大家介紹了關(guān)于Android設(shè)備獲取掃碼槍掃描內(nèi)容的方法,以及在開發(fā)中可能會遇到的問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

大家應(yīng)該都有所體會,在生活中條形碼掃碼槍可是隨處可見,可以很迅速地掃描出條形碼內(nèi)容,比什么手機相機掃碼快了不是一點兩點。

為了節(jié)約成本,掃碼槍可以直接通過藍牙連接android或其他設(shè)備。

那么android設(shè)備如何通過藍牙獲取掃描內(nèi)容的呢?

1. 藍牙配對,連接設(shè)備

打開系統(tǒng)設(shè)置,找到藍牙,打開掃碼槍,配對掃碼槍設(shè)備。輸入一個固定的配對碼,一般掃碼槍說明書里都有寫。配對完成后,顯示設(shè)備已連接。就ok。

2.AndroidManifest中配置權(quán)限

android項目中的AndroidManifest.xml文件添加藍牙權(quán)限。

<uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

3.檢測掃碼槍的連接狀態(tài)

通常來說,掃碼槍設(shè)備也相當于普通外接輸入設(shè)備類型,外接鍵盤。

我這款掃碼槍設(shè)備返回的是如下藍牙類型。

1

BluetoothClass.Device.Major.PERIPHERAL

一般而言,通過如下這種方式就可以獲得到我們掃碼槍設(shè)備的信息。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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) {

?//TODO 獲取掃碼槍設(shè)備信息

?}

}

開發(fā)過程中,必然會需要實時判斷設(shè)備是否正常連接。

1

mBluetoothAdapter.getBondedDevices()

這個方法僅僅只能夠判斷設(shè)備是否已配對綁定。但是綁定不代表連接,所以只能放棄。

1

2

public List getConnectedDevices (int profile)

public int getConnectionState (BluetoothDevice device, int profile)

接著又嘗試了這兩個方法,方法是可用,但是必須要求設(shè)備sdk>18,即android 4.3版本以上才可用。

后來轉(zhuǎn)頭一想,既然掃碼槍也是輸入設(shè)備,我們可以不同藍牙設(shè)備狀態(tài)檢測入手,改為從輸入設(shè)備檢測入手。于是,

1

2

3

4

private void hasScanGun() {

?Configuration cfg = getResources().getConfiguration();

?return cfg.keyboard != Configuration.KEYBOARD_NOKEYS;

}

搞定。

4.獲取掃碼槍掃描內(nèi)容

掃描槍,既然是一個外接輸入設(shè)備,那么很自然的,我們就從KeyEvent入手。

事件解析類

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

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

/**

?* 掃碼槍事件解析類

?*/

public class ScanGunKeyEventHelper {

?//延遲500ms,判斷掃碼是否完成。

?private final static long MESSAGE_DELAY = 500;

?//掃碼內(nèi)容

?private StringBuffer mStringBufferResult = new StringBuffer();

?//大小寫區(qū)分

?private boolean mCaps;

?private OnScanSuccessListener mOnScanSuccessListener;

?private Handler mHandler = new Handler();

?private final Runnable mScanningFishedRunnable = new Runnable() {

?@Override

?public void run() {

??performScanSuccess();

?}

?};

?//返回掃描結(jié)果

?private void performScanSuccess() {

?String barcode = mStringBufferResult.toString();

?if (mOnScanSuccessListener != null)

??mOnScanSuccessListener.onScanSuccess(barcode);

?mStringBufferResult.setLength(0);

?}

?//key事件處理

?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內(nèi),有其他事件

??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;

??}

?}

?}

?//獲取掃描內(nèi)容

?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) {

??//數(shù)字

??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 {

?public void onScanSuccess(String barcode);

?}

?public void setOnBarCodeCatchListener(OnScanSuccessListener onScanSuccessListener) {

?mOnScanSuccessListener = onScanSuccessListener;

?}

?public void onDestroy() {

?mHandler.removeCallbacks(mScanningFishedRunnable);

?mOnScanSuccessListener = null;

?}

}

Activity中重寫dispatchKeyEvent方法,截取Key事件。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/**

* Activity截獲按鍵事件.發(fā)給ScanGunKeyEventHelper

*

* @param event

* @return

*/

@Override

public boolean dispatchKeyEvent(KeyEvent event) {

if (isScanGunEvent(event)) {

?mScanGunKeyEventHelper.analysisKeyEvent(event);

?return true;

}

return super.dispatchKeyEvent(event);

}

/**

* 顯示掃描內(nèi)容

* @param barcode 條形碼

*/

@Override

public void onScanSuccess(String barcode) {

//TODO 顯示掃描內(nèi)容

}

詳細代碼參看:GitHub - czhzero/scangon: Android藍牙掃碼槍開發(fā)示例

注意點:

1.部分機型無法判斷外接鍵盤信息,如三星。

1

2

3

4

private void hasScanGun() {

?Configuration cfg = getResources().getConfiguration();

?return cfg.keyboard != Configuration.KEYBOARD_NOKEYS;

}

三星手機cfg.keyboard返回值等于Configuration.KEYBOARD_NOKEYS。

因此為了更好的兼容,可以采用如下方法,

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

/**

?* 判斷是否已經(jīng)連接掃碼槍

?* @return

?*/

protected boolean hasScanGun() {

?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) {

??return isInputDeviceUsed(bluetoothDevice.getName());

?}

?}

?return false;

}

private boolean isInputDeviceUsed(String deviceName) {

?int[] deviceIds = InputDevice.getDeviceIds();

?for (int id : deviceIds) {

?if (InputDevice.getDevice(id).getName().equals(deviceName)) {

??return true;

?}

?}

?return false;

}

Anroid系統(tǒng)解決掃碼槍無法輸入字母和字符問題

問題:

在使用掃碼槍掃碼條碼的時候明明有字母和字符,但是輸入到Android系統(tǒng)卻沒喲,輸入到電腦是正常的,這就很奇怪,讓一個搞上層開發(fā)的摸不著頭腦,最后和系統(tǒng)討論才知道是系統(tǒng)按鍵部分映射被刪除導(dǎo)致的。

解決辦法:

在Android系統(tǒng)層frameworks/base/data/keyboards文件夾下面有Generic.kl這個文件,此文件為Android默認的按鍵映射對應(yīng)表,還有其他的比如:qwerty.kl文件,以及一些自定義碼值的kl文件。
打開Generic.kl看看類型也許就明白了.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

key 11 0

key 2 1

key 3 2

key 4 3

key 5 4

key 6 5

key 7 6

key 8 7

key 9 8

key 10 9

key 12 MINUS

key 13 EQUALS

key 14 DEL

key 15 TAB

里面是鍵與鍵值的映射,比如:鍵值11 對應(yīng)的按鍵為 0 這個,以此類推。那解決就明朗了,將所有字母和字符的按鍵映射添加進行就ok了,至于按鍵值是多少我這邊直接參考了另外一個平臺的Generic.kl文件。重新編譯系統(tǒng)驗證,此問題解決了。

疑惑問題:

  • 用相同Android版本的android.jar 查看keyCode對應(yīng)的值和Generic.kl文件里描述的不一樣,此問題還沒有弄明白為什么,系統(tǒng)說兩個是不相關(guān)的?
  • 發(fā)現(xiàn)在兩個平臺上有大部分按鍵值在一致的,但存在分別的是不樣的,不明白怎么定義的。依據(jù)是啥?

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

?

轉(zhuǎn)載于:Android設(shè)備獲取掃碼槍掃描的內(nèi)容與可能遇到的問題解決_Android_腳本之家?

總結(jié)

以上是生活随笔為你收集整理的Android设备获取USB扫码枪扫描的内容与可能遇到的问题解决的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91视频一区二区三区 | 成人免费视频一区二区 | av资源在线 | 日韩一卡| 国产人妻大战黑人20p | 成人91免费视频 | 91久久久久久久久 | 99国产精品99久久久久久 | 毛片99| 日韩欧美国产成人精品免费 | 人妖一区 | 雪花飘电影在线观看免费高清 | 国产在线视频在线观看 | 日本一区二区三区免费在线观看 | 中文字幕亚洲第一 | 丁香一区二区三区 | 国产 丝袜 欧美中文 另类 | 欧美一卡二卡三卡四卡 | 亚洲a v网站 | 久久99精品久久久久久 | 国产美女极度色诱视频www | 日韩在线观看视频一区 | 成人欧美一区二区三区黑人孕妇 | 日韩毛片视频 | 在线看黄色的网站 | 丰满人妻一区二区三区免费 | 黄页免费视频 | 91网页在线观看 | 欧美成人一区在线观看 | 日本美女裸体视频 | 九九视频在线播放 | 亚洲性激情 | 婷婷色网| 天堂久久一区 | 天天国产视频 | 亚洲国产成人自拍 | 亚洲婷婷在线观看 | 中文字幕人妻丝袜乱一区三区 | 午夜激情欧美 | 性色国产成人久久久精品 | 超碰天天| 肉视频在线观看 | 丁香花电影免费播放在线观看 | 久久不射网 | 国产综合精品在线 | 一级特黄aaaaaa大片 | 婷婷在线视频观看 | a√在线视频 | 国产性生活视频 | 麻豆福利视频 | 日本成人黄色片 | 国产操女人 | 成人av影视在线 | 一区二区三区免费在线观看视频 | 91九色蝌蚪在线 | 97超碰国产在线 | 一区二区三区视频在线观看免费 | 在线中文字幕av | 校园激情av| 久久一道本 | 国产人妖一区二区三区 | 精品乱码一区二区三区 | 深夜视频一区二区三区 | 欧美xxxx×黑人性爽 | 欧美在线网 | 欧美sm极限捆绑bd | 国产高清视频在线 | 亚洲天堂网络 | 一级一毛片 | 传媒一区二区 | 日韩精品一区二区在线看 | 两个人做羞羞的视频 | 欧美1 | 青青草伊人| 96视频在线观看 | 超碰人人擦| 亚洲成av人片 | 欧美www| 久久精品99国产国产精 | 欧美亚洲视频在线观看 | 亚洲三区在线 | 秋霞一级视频 | 深爱激情综合网 | 91久久久久久久久久 | 天堂网2014| 亚洲a级片 | 久久精品a亚洲国产v高清不卡 | 青青草国产在线观看 | 日韩av黄色片 | 性欧美ⅹxxxx极品护士 | 亚洲人女屁股眼交6 | 三级一区二区 | 欧洲丰满少妇做爰 | 粉色视频网站 | 欧美精品极品 | 嫩色av | 好吊色综合 | 黄页网站视频在线观看 | 成人aaaaa|