日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色综合天天综合网天天狠天天 | 在线视频欧美日韩 | 孕妇毛片| 亚洲av无码片一区二区三区 | www.国产黄色 | 亚洲午夜免费 | 欧美激情第1页 | 美女福利视频导航 | 草草影院最新网址 | 午夜影院在线观看 | 日本不卡视频一区 | av免费在线电影 | 精品国产欧美一区二区 | 开心激情网站 | japanese国产在线观看 | 漂亮人妻洗澡被公强 日日躁 | 欧美精品www | 潘金莲一级淫片aaaaa武则天 | 精品久久免费观看 | 麻豆射区 | 人妻无码一区二区三区久久99 | 亚洲爱情岛论坛永久 | 国产大学生av| 天天综合天天综合 | 成人毛片18女人 | 中出少妇 | 国产无精乱码一区二区三区 | 久久精品久久久久久 | 欧美一区二区三区公司 | 91伦理 | 丰满少妇被猛烈进入一区二区 | 午夜免费影院 | 99精品在线观看 | 人人澡人人澡人人 | 国产亚洲在线观看 | 五月婷婷一区二区三区 | 亚洲美女一区 | 高清视频在线播放 | 毛片网在线观看 | 中国亚洲女人69内射少妇 | 欧美日韩国产激情 | 国产一区视频在线观看免费 | hd性videos意大利精品 | 中文国语毛片高清视频 | 久久精选 | 亚洲中文字幕无码不卡电影 | 国产1区2区3区4区 | 久久综合伊人77777蜜臀 | 国产不卡av在线 | 日韩女优一区二区 | 一区二区三区四区欧美 | 亚洲精品字幕 | 中文在线不卡视频 | 综合天堂av久久久久久久 | 日本一区二区三区四区在线观看 | 在线观看免费的av | 亚洲第3页| 少女国产免费观看 | 强videoshd酒醉 | av免费资源 | 黄色一几片| 乱色欧美| 二区三区在线观看 | 台湾性dvd性色av | 丝袜操| 久艹在线 | 日本少妇一级片 | 狼人综合视频 | 日本黄色大片免费看 | 日本精品人妻无码免费大全 | 亚洲天堂伦理 | www国产精品内射老熟女 | 成人欧美一区二区三区黑人一 | 国产精品久久久久久久专区 | 国产91影院 | 波多野结衣mp4 | 国产超碰人人模人人爽人人添 | 老外黄色一级片 | 欧美性大战久久久久xxx | 免费荫蒂添的好舒服视频 | 国产区在线视频 | 香蕉视频 | 日本男人天堂 | 日韩裸体视频 | 亚洲天堂8 | 日韩三级成人 | 天天综合91 | 日韩免费精品 | 二级黄色片 | www.亚洲激情 | 欧美老熟妇乱大交xxxxx | 天天干干干 | 国产精品国产三级国产普通话蜜臀 | 午夜av在线播放 | 黄页免费视频 | 老司机激情影院 | 69日本xxxxxxxx96 | 色视频综合 | 麻豆av电影网 |