## 扫码盒 Android SDK 集成文档(usb)

## 一、Android SDK概述

Android sdk实现了android手机与扫码盒的连接通讯，手机通过连接可以获取扫码盒的基本参数信息（序列号）及扫码后的二维码信息，同时可以发送数据到扫码盒。

## 二、运行环境

sdk支持android 4.1及上版本的手机系统（因为从 Android4.1开始，才正式支持USB Host），手机硬件需支持USB功能

## 三、集成准备

### 导入SDK LIB

- 将sdk文件包libs文件夹中jar包复制到项目目录的libs文件夹下

### 在AndroidManifest.xml 里添加相关声明

- 添加权限声明(USB)

```xml

        <uses-feature android:name="android.hardware.usb.host" android:required="true"/>
        解决键盘类USB插拔影响Activity生命周期触发断开连接重新通讯的问题add configChanges="keyboard|keyboardHidden"

```

- 注册的service

```xml

    <service android:name="com.wsm.hidlib.service.HIDService"/>

```

## 四、集成步骤

### 1、打开USB通讯

- 导入HIDManager如下所示：

```java

    import com.wsm.hidlib.HIDManager;
    import com.wsm.hidlib.callback.HIDDataListener;
    import com.wsm.hidlib.callback.HIDOpenListener;
    import com.wsm.hidlib.constant.ConnectCostant;
    import com.wsm.hidlib.constant.FormatConstant;

    public void openHID(Context context, HIDOpenListener hidOpenListener, HIDDataListener hidDataListener)

        context:上下文对象   hidOpenListener: 设备状态回调 hidDataListener：数据接收回调

```

- hidOpenListener 设备状态回调

```java

    void openSuccess(int openSuccessStatus);

        连接状态 openSuccessStatus：  USB_CONNECT： 连接USB；  COMMUNICATION_OPEN：通讯建立

    void openError(int openErrorStatus);

        断开状态 openErrorStatus :   USB_DISCONNECT：断开USB；  COMMUNICATION_CLOSE：通讯断开；

```

- hidDataListener：数据接收回调

```java

    void onDataReceived(String dataMessage);

        dataMessage：数据内容

    void onOriginalDataReceived(byte[] bytes, int length);

     bytes：收到数据的字节数组形式
     length：字节数组长度

```

### 2、关闭USB通讯

- 建议在onDestroy调用,关闭USB通讯并释放资源

```java

    public void closeHID()

```

### 3、获取序列号SN

```java

    public void getSequenceNumber(HIDSequenceNumberListener hidSequenceNumberListener)

    hidSequenceNumberListener：序列号SN接收回调

    void onSequenceNumberReceived(byte[] bytes, int length);

     bytes：收到序列号的字节数组形式
     length：字节数组长度

```

### 4、发送数据

```java

    public void sendData(String sendMessage)

    向扫码盒发送数据如果回应通过onDataReceived回调；sendMessage：16进制的字符串

```

### 5、额外功能

```java

    public int getHIDStatus()

    获取扫码盒连接状态；
    返回整型数字：
    USB_CONNECT  usb连接
    USB_DISCONNECT  usb断开
    COMMUNICATION_OPEN  通讯打开
    COMMUNICATION_CLOSE  通讯关闭

    public boolean setFormat(String format)
    设置输出字符串编码格式；format 字符串编码格式
    FORMAT_UTF8 = "UTF-8";
    FORMAT_GBK = "GBK";
    FORMAT_HEX = "HexStr";
    返回设置结果 true 成功，false 失败

    public boolean setPackageTimeOut(long timelone)

    设置超时时间；timelone 传入的设置超时时间，取值范围50L-5000L,默认500L
    返回设置结果 true 成功，false 失败

    public boolean addDeviceID(int vid, int pid)

    默认支持两组设备[[0x1FCA,0x5AA8],[0x34EB,0x1503]],如果需要支持新设备，需要先添加设备VID、PID到支持列表再openHID打开USB通讯。

```

- 目前因为手机系统定制原因，如果手机开启了省电功能比如息屏清理后台（华为）、神隐模式（小米），息屏模式下使用可能存在服务被销毁的情况,请留意扫码盒提示。
- vivo和oppo型号的手机，需要手动去设置-更多设置里面打开OTG开关

## 五、更新日志

### 1.0.0版本（2020.6.30）

- 1、集成自动连接扫码盒、应用与扫码盒互传数据；
- 2、集成设置超时时间，字符串输出编码格式；
- 3、集成获取序列号，获取设备连接状态；

### 1.0.1版本（2020.7.21）

- 1、修复高频率获取SN，数据堵塞问题；
- 2、更新获取序列号接口返回形式；

### 1.0.2版本（2021.9.9）

- 1、增加设置设备vid/pid；

### 1.0.3版本（2022.1.19）

- 1、设置默认GBK；
- 2、检测到拔出事件回调断开改为拔出后遍历是否还有vid/pid的目标设备再触发回调断开。

### 1.0.4版本（2022.7.20）

- 1、默认支持两组设备VID、PID[[0x1FCA,0x5AA8],[0x34EB,0x1503]]；
- 2、设置VID、PID修改成添加VID、PID。

### 1.0.5版本（2024.5.22）

- 1、解决键盘类USB插拔影响Activity生命周期触发断开连接重新通讯的问题；
- 2、USB插入时如端口还有目标设备正在通讯，此时不触发查找端口。