diff --git a/docs/Android扫描接口文档.md b/docs/Android扫描接口文档.md
new file mode 100644
index 0000000..c542061
--- /dev/null
+++ b/docs/Android扫描接口文档.md
@@ -0,0 +1,753 @@
+# Android 扫描接口说明
+
+> 江苏东大集成电路系统工程技术有限公司
+> www.seuic.com
+
+![SEUIC 东集 Logo 图片占位符]
+
+![世界地图装饰图片占位符]
+
+## 修订记录
+
+| 版本号 | 修订日期 | 修订内容 | 修订人员 |
+| --- | --- | --- | --- |
+| 1.0 | 2017/03/16 | 建立本文档 | 罗涛 |
+| 1.1 | 2017/5/31 | 加入回调函数注意事项说明 | 罗涛 |
+| 1.2 | 2017/11/13 | 修正关于图像读取接口的描述 | 罗涛 |
+| 1.3 | 2017/11/20 | 添加新增参数介绍 | 罗涛 |
+
+## 目录
+
+- 概述
+ - 硬件平台
+ - 软件平台
+ - 适用对象
+- 准备工作
+ - Jar 包引用方法
+ - 所需的相关权限
+- 扫描相关类介绍
+ - 扫描工厂类
+ - 扫描类
+ - 扫描数据回调接口类
+ - 读取图像回调接口类
+ - 扫描状态回调接口类
+ - 扫描数据类
+ - 扫描按键监听类
+- 扫描接口介绍
+ - 获取扫描头上下文
+ - 打开扫描头
+ - 关闭扫描头
+ - 开始扫描
+ - 停止扫描
+ - 设置扫描条码回调
+ - 启用扫描头
+ - 禁用扫描头
+ - 获取条码参数
+ - 设置条码参数
+ - 获取扫描成功后图像
+ - 开始读取图像
+ - 停止读取图像
+ - 设置读取图像回调
+ - 设置扫描头状态回调
+- 扫描参数介绍
+ - 条码设置参数
+ - 扫描状态参数
+
+---
+
+# 概述
+
+我司提供的所有设备上已经内置了扫描服务及应用,方便客户定制扫描服务,但是由于有部分客户需要自己开发基于我司扫描 SDK 的应用,故本文档致力于介绍有关扫描 SDK 的相关内容,以便帮助用户更为灵活地使用我们的设备。
+
+## 硬件平台
+
+SDK 适用于我司所有终端设备,具体使用范围在函数接口说明中指明,若无指明表示都支持。
+
+## 软件平台
+
+SDK 基于 Android 4.3、Android 4.4、Android 5.1 版本,支持 Eclipse、Android Studio 开发工具。
+
+## 适用对象
+
+希望在自己的应用中定制扫描的开发人员。
+
+---
+
+# 准备工作
+
+## Jar 包引用方法
+
+**1、首先以 Eclipse 为例**,右击项目 → Properties → Java Build Path → Libraries → Add External JARs,选择 `ScannerAPI.jar` 文件。
+
+![Eclipse 添加外部 JAR 包截图占位符]
+
+**2、以 Android Studio Version:2.2.2 版本为例**,在 project 中,在 app 目录下新建一个 `libsref` 目录,将 `ScannerAPI` 放入该目录下,并右击工程选择 Open Module Settings 选中相应的 Module,切换至最右方的 Dependencies,点击右方加号,选择 File dependency 添加 `ScannerAPI.jar`,并且修改 scope 为 `provided`,声明该 `ScannerAPI.jar` 只在编译时需要依赖,在运行时不需要。
+
+① 将 `ScannerAPI.jar` 放入 `app/libsref/` 下
+
+![Android Studio 项目结构 libsref 目录截图占位符]
+
+② 右击工程选择 Open Module Settings 选中相应的 Module,切换至最后方的 Dependencies,点击右方加号,选择 File dependency 添加 `ScannerAPI.jar`
+
+![Android Studio Open Module Settings 菜单截图占位符]
+
+![Android Studio Dependencies 添加 jar 包截图占位符]
+
+③ 更改 compile 为 provided,声明该 `ScannerAPI.jar` 只在编译时需要依赖,在运行时不需要,最后保存设置即可。
+
+![Android Studio scope 设置为 Provided 截图占位符]
+
+④ 如果设置成功,会在相应的 `build.gradle` 中有如下 dependencies:
+
+```gradle
+dependencies {
+ provided files('libsref/ScannerAPI.jar')
+}
+```
+
+## 所需的相关权限
+
+在进行基于我们的扫描 SDK 开发的时候,需在 `AndroidManifest.xml` 的 application 节点下添加以下代码:
+
+```xml
+
+```
+
+D500/D510/D330S 设备中二维扫描需添加以下权限:
+
+```xml
+
+
+```
+
+**注意点:**
+
+1. 在一个应用中只需要打开一次扫描头即可,不需要打开多次,否则会耗时太大,产生卡屏现象。
+2. 退出程序的时候可以选择关闭扫描头,其余场合不可关闭。
+3. 可以参照测试 demo 中的方式,在 `ScannerService` 中定义 action,在使用扫描的 UI 中直接使用动态注册广播接收器接收到扫描解析的结果。
+
+---
+
+# 扫描相关类介绍
+
+## 扫描工厂类
+
+| 项目 | 内容 |
+| --- | --- |
+| 包名 | `com.seuic.scanner` |
+| 类名 | `ScannerFactory` |
+| 说明 | 扫描工厂类,主要用于获取扫描头资源 |
+
+## 扫描类
+
+| 项目 | 内容 |
+| --- | --- |
+| 包名 | `com.seuic.scanner` |
+| 类名 | `Scanner` |
+| 说明 | 扫描主要实现类,定义了一系列扫描操作方法 |
+
+## 扫描数据回调接口类
+
+| 项目 | 内容 |
+| --- | --- |
+| 包名 | `com.seuic.scanner` |
+| 类名 | `DecodeInfoCallBack` |
+| 回调函数 | `onDecodeComplete(DecodeInfo barcodeInfo)` |
+| 回调函数参数 | param1: 条码信息,`DecodeInfo` |
+| 回调函数返回值 | void |
+| 说明 | 扫描回调函数,用户需引用该接口,并调用 `Scanner` 类中 `setDecodeInfoCallBack` 后可获得条码信息。 |
+
+> **注意:** 该回调方法中请勿进行 UI 操作!
+
+## 读取图像回调接口类
+
+| 项目 | 内容 |
+| --- | --- |
+| 包名 | `com.seuic.scanner` |
+| 类名 | `VideoCallBack` |
+| 回调函数 | `onVideoCallBack(int width, int height, byte[] img)` |
+| 回调函数参数 | param1: 返回图像宽度
param2: 返回图像高度
param3: 返回的图像数据(Bitmap 格式) |
+| 回调函数返回值 | `true`:操作成功,停止出光并终止对图像的读取
`false`:操作失败,继续读取图像 |
+| 说明 | 扫描回调函数,用户需引用该接口,并调用 `Scanner` 类中的 `setVideoCallBack` 后可获得图像数据,同时每取得一帧图像都会调用该函数,第三方的相关操作在此处处理。 |
+
+> **注意:** 该回调方法中请勿进行 UI 操作!
+
+## 扫描状态回调接口类
+
+| 项目 | 内容 |
+| --- | --- |
+| 包名 | `com.seuic.scanner` |
+| 类名 | `StatusCallBack` |
+| 回调函数 | `onStatusCallBack(int status, int info)` |
+| 回调函数参数 | param1: 状态信息
0:扫描成功
1:扫描超时
2:扫描被取消
3:扫描出现错误(暂未使用)
4:其他事件(暂未使用)
param2: 其他额外信息(暂未使用)
扫描状态参数参见:扫描状态参数 |
+| 回调函数返回值 | void |
+| 说明 | 状态回调函数,用户可引用该接口,并且调用 `Scanner` 类中的 `setStatusCallBack` 后可以当扫描头状态更新时获得当前扫描状态。 |
+
+> **注意:** 该回调方法中请勿进行 UI 操作!
+
+## 扫描数据类
+
+| 项目 | 内容 |
+| --- | --- |
+| 包名 | `com.seuic.scanner` |
+| 类名 | `DecodeInfo` |
+| 类成员 | `String barcode`:条码数据
`String codetype`:条码类型
`int length`:条码长度 |
+
+## 扫描按键监听类
+
+| 项目 | 内容 |
+| --- | --- |
+| 包名 | `com.seuic.scanner` |
+| 类名 | `ScannerKey` |
+| 类成员变量 | `KEY_DOWN`:扫描按键按下
`KEY_UP`:扫描按键抬起 |
+| 类方法 | `int open()`:打开扫描键监听,返回 1:打开成功,-1:打开失败
`int getKeyEvent()`:获取按键事件,返回:1:扫描键按下,0:扫描键抬起,-1:获取失败。注意:该方法将阻塞进程,推荐异步调用。
`void close()`:关闭扫描键监听 |
+| 说明 | 扫描按键监听类 |
+
+**示例代码:**
+
+```java
+import com.seuic.scanner.Scanner;
+import com.seuic.scanner.ScannerKey;
+import com.seuic.scanner.ScannerFactory;
+
+public class ScannerApiTest {
+ // ……
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ int ret1 = ScannerKey.open();
+ if (ret1 > -1) {
+ while (true) {
+ int ret = ScannerKey.getKeyEvent();
+ if (ret > -1) {
+ switch (ret) {
+ case ScannerKey.KEY_DOWN:
+ scanner.startScan();
+ break;
+ case ScannerKey.KEY_UP:
+ scanner.stopScan();
+ break;
+ }
+ }
+ }
+ }
+ }
+ };
+ // ……
+ ScannerKey.close();
+}
+```
+
+---
+
+# 扫描接口介绍
+
+> 接口具体使用范围若无指明表示所有扫描头都支持。
+
+## 获取扫描头上下文
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类 | `ScannerFactory` |
+| 接口 | `getScanner` |
+| 接口参数 | `Context context` |
+| 返回值 | `Scanner` 实例 |
+| 说明 | 获取扫描类实例 |
+
+**示例代码:**
+
+```java
+import com.seuic.scanner.ScannerFactory;
+import com.seuic.scanner.Scanner;
+
+public class ScannerApiTest {
+ // ……
+ Scanner scanner = ScannerFactory.getScanner(context);
+ // ……
+}
+```
+
+## 打开扫描头
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类 | `Scanner` |
+| 接口名称 | `open` |
+| 接口参数 | void |
+| 接口返回值 | boolean |
+| 说明 | 返回 `true`,打开扫描头成功;返回 `false`,打开扫描头失败。**注意**:仅在该方法返回为 `true` 时,才可进行扫描头其他操作。 |
+
+**示例代码:**
+
+```java
+import com.seuic.scanner.ScannerFactory;
+import com.seuic.scanner.Scanner;
+
+public class ScannerApiTest {
+ // ……
+ Scanner scanner = ScannerFactory.getScanner(context);
+ Boolean status = scanner.open();
+ // ……
+}
+```
+
+## 关闭扫描头
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类 | `Scanner` |
+| 接口名称 | `close` |
+| 接口参数 | void |
+| 接口返回值 | void |
+| 说明 | 释放扫描头资源 |
+
+**示例代码:**
+
+```java
+import com.seuic.scanner.ScannerFactory;
+import com.seuic.scanner.Scanner;
+
+public class ScannerApiTest {
+ // ……
+ Scanner scanner = ScannerFactory.getScanner(context);
+ Boolean status = scanner.close();
+ // ……
+}
+```
+
+## 开始扫描
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类 | `Scanner` |
+| 接口名称 | `startScan` |
+| 接口参数 | void |
+| 接口返回值 | void |
+| 说明 | 开始扫描:扫描头出光进入条码读取模式 |
+
+## 停止扫描
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类 | `Scanner` |
+| 接口名称 | `stopScan` |
+| 接口参数 | void |
+| 接口返回值 | void |
+| 说明 | 停止扫描,可使扫描头灭光并终止条码读取 |
+
+## 设置扫描条码回调
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类名 | `Scanner`、`DecodeInfoCallBack`、`DecodeInfo` |
+| 接口名称 | `setDecodeInfoCallBack` |
+| 接口参数 | param1:`DecodeInfoCallBack` |
+| 接口返回值 | void |
+| 说明 | 设置用户扫描结束后的回调函数,该函数是获取包括条码数据、长度、类型的信息。在设置之前确保实现了 `DecodeInfoCallBack` 中的 `onDecodeComplete` 方法。 |
+
+**示例代码:**
+
+```java
+import com.seuic.scanner.ScannerFactory;
+import com.seuic.scanner.Scanner;
+import com.seuic.scanner.DecodeInfoCallBack;
+import com.seuic.scanner.DecodeInfo;
+
+public class ScannerApiTest implements DecodeInfoCallBack {
+ // ……
+ Scanner scanner = ScannerFactory.getScanner(context);
+ scanner.setDecodeInfoCallBack(this);
+ scanner.startScan();
+ // …….
+ scanner.stopScan();
+
+ @Override
+ public void onDecodeComplete(DecodeInfo info) {
+ // ……
+ }
+ // ……
+}
+```
+
+## 启用扫描头
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类 | `Scanner` |
+| 接口名称 | `enable` |
+| 接口参数 | void |
+| 接口返回值 | void |
+| 说明 | 启用扫描头 |
+
+**示例代码:**
+
+```java
+import com.seuic.scanner.ScannerFactory;
+import com.seuic.scanner.Scanner;
+
+public class ScannerApiTest {
+ // ……
+ Scanner scanner = ScannerFactory.getScanner(context);
+ scanner.enable();
+ // ……
+}
+```
+
+## 禁用扫描头
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类 | `Scanner` |
+| 接口名称 | `disable` |
+| 接口参数 | void |
+| 接口返回值 | void |
+| 说明 | 禁用扫描头,该操作完成后,将无法进行扫描操作 |
+
+**示例代码:**
+
+```java
+import com.seuic.scanner.ScannerFactory;
+import com.seuic.scanner.Scanner;
+
+public class ScannerApiTest {
+ // ……
+ Scanner scanner = ScannerFactory.getScanner(context);
+ scanner.disable();
+ // ……
+}
+```
+
+## 获取条码参数
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类 | `Scanner` |
+| 接口名称 | `getParams` |
+| 接口参数 | param1:参数代码。例如:获取 Scan Angle 的值,条码参数便是 `0x02`,具体参数代码参见:条码设置参数 |
+| 接口返回值 | int 类型,条码参数当前值 |
+| 说明 | 根据参数代码获取该参数当前的设定值 |
+
+## 设置条码参数
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类 | `Scanner` |
+| 接口名称 | `setParams` |
+| 接口参数 | param1:参数代码。例如:设置 Scan Angle 的值,条码参数便是 `0x02`
param2:需要设置的参数值
参数代码参见:条码设置参数 |
+| 接口返回值 | boolean:`true` 设置成功,`false` 设置失败 |
+| 说明 | 根据参数代码设置扫描参数值 |
+
+**示例代码:**
+
+```java
+import com.seuic.scanner.ScannerFactory;
+import com.seuic.scanner.Scanner;
+
+public class ScannerApiTest {
+ // ……
+ Scanner scanner = ScannerFactory.getScanner(context);
+ int value = scanner.getParams(0x02);
+ // ……
+ scanner.setParams(0x02, 1);
+}
+```
+
+## 获取扫描成功后图像
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类 | `Scanner` |
+| 接口名称 | `getLastImage` |
+| 接口参数 | void |
+| 接口返回值 | `byte[]`:图像数据,width: 832 height: 640,图像格式为 bitmap |
+| 说明 | 当完成一次成功的扫描后,调用该接口,获取该次用于解码的扫描图像 |
+
+> **注意:** 该接口仅适用于 A9/A-PAD/A6L-P/CRUISE 中的 S8
+
+**示例代码:**
+
+```java
+import com.seuic.scanner.ScannerFactory;
+import com.seuic.scanner.Scanner;
+
+public class ScannerApiTest {
+ // ……
+ Scanner scanner = ScannerFactory.getScanner(context);
+ scanner.startScan();
+ // ……
+ byte[] image = scanner.getLastImage();
+}
+```
+
+## 开始读取图像
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类 | `Scanner` |
+| 接口名称 | `startVideo` |
+| 接口参数 | param1:int 类型,设置超时时间,单位为:ms |
+| 接口返回值 | `0`:回调函数 `onVideoCallback` 返回成功自动退出无需调用 `stopVideo`
`9`:参数无效退出
`17`:调用 `stopVideo` 手动退出
`6`:取图像失败退出
`25`:超时退出
`2`:未知错误退出 |
+| 说明 | 开始读取图像:扫描头开始出光并进入图像读取模式,为阻塞函数,且与 `startScan` 不可同时使用。 |
+
+> **注意:** 该接口仅适用于 A9/A-PAD/A6L-P/CRUISE 中的 S8
+
+## 停止读取图像
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类 | `Scanner` |
+| 接口名称 | `stopVideo` |
+| 接口参数 | void |
+| 接口返回值 | void |
+| 说明 | 扫描头停止出光并终止对图像地读取。 |
+
+> **注意:** 该接口仅适用于 A9/A-PAD/A6L-P/CRUISE 中的 S8
+
+## 设置读取图像回调
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类名 | `Scanner`、`VideoCallBack` |
+| 接口名称 | `setVideoCallBack` |
+| 接口参数 | param1:`VideoCallBack` |
+| 接口返回值 | void |
+| 说明 | 设置用户扫描进入读取图像模式后的回调函数,该接口仅适用于 A9/A-PAD/A6L-P/CRUISE 中的 S8 |
+
+**示例代码:**
+
+```java
+import com.seuic.scanner.ScannerFactory;
+import com.seuic.scanner.Scanner;
+import com.seuic.scanner.VideoCallBack;
+
+public class ScannerApiTest implements VideoCallBack {
+ // ……
+ Scanner scanner = ScannerFactory.getScanner(context);
+ scanner.setVideoCallBack(this);
+ scanner.startVideo(3000);
+ // ……
+ scanner.stopVideo();
+
+ @Override
+ public boolean onVideoCallBack(int width, int height, byte[] img) {
+ // ……
+ }
+ // ……
+}
+```
+
+## 设置扫描头状态回调
+
+| 项目 | 内容 |
+| --- | --- |
+| 引用包名 | `com.seuic.scanner` |
+| 引用类名 | `Scanner`、`StatusCallBack` |
+| 接口名称 | `setStatusCallBack` |
+| 接口参数 | param1:`StatusCallBack` 接口类 |
+| 接口返回值 | void |
+| 说明 | 设置用户获取当前扫描状态的回调函数,在设置之前务必实现 `StatusCallBack` 中的 `onStatusCallBack` 方法,设置之后有关扫描的状态会自动回调 `onStatusCallBack` 将当前状态反馈给用户 |
+
+**示例代码:**
+
+```java
+import com.seuic.scanner.ScannerFactory;
+import com.seuic.scanner.Scanner;
+
+public class ScannerApiTest implements StatusCallBack {
+ // ……
+ Scanner scanner = ScannerFactory.getScanner(context);
+ scanner.setStatusCallBack(this);
+
+ @Override
+ public boolean onStatusCallBack(int status, int info) {
+ // ……
+ }
+ // ……
+}
+```
+
+---
+
+# 扫描参数介绍
+
+## 条码设置参数
+
+| Parameter | Parameter Number (Hex) |
+| --- | --- |
+| Laser On Time | 0x01 |
+| Scan Angle | 0x02 |
+| Time Out Between Same Symbol | 0x03 |
+| Linear Code Type Security Levels | 0x04 |
+| Bi-directional Redundancy | 0x06 |
+| Aimer/Illumination lighting combinations | 0x07 |
+| Mobile Phone/Display Mode | 0x08 |
+| Illumination Power Level | 0x09 |
+| Decode Time Out | 0x0a |
+| Adaptive Scanning | 0x0b |
+| Continue Scan Mode | 0x0c |
+| Exposure Mode | 0x0d |
+| Picklist Mode | 0x0e |
+| Aim Accuracy Level | 0x0f |
+| GS1 AI Separator | 0x10 |
+| Transfer Aim ID | 0x11 |
+| Inverse Mode | 0x12 |
+| Low Power Delay Time | 0x13 |
+| Hold Scanning Time Out | 0x14 |
+| UPC-A | 0x101 |
+| UPC-E | 0x102 |
+| UPC-E1 | 0x103 |
+| EAN-8 | 0x104 |
+| EAN-13 | 0x105 |
+| Bookland EAN | 0x106 |
+| Transmit UPC-A Check Digit | 0x107 |
+| Transmit UPC-E Check Digit | 0x108 |
+| Transmit UPC-E1 Check Digit | 0x109 |
+| Transmit EAN-13 Check Digit | 0x10a |
+| Transmit EAN-8 Check Digit | 0x10b |
+| UPC-A Preamble | 0x10c |
+| UPC-E Preamble | 0x10d |
+| UPC-E1 Preamble | 0x10e |
+| Convert UPC-E to A | 0x10f |
+| Convert UPC-E1 to A | 0x110 |
+| Convert EAN-8 to 13 | 0x111 |
+| UCC Coupon Extended Code | 0x112 |
+| UPC-E Expand | 0x113 |
+| UPC-A 2 Char Addenda | 0x114 |
+| UPC-A 5 Char Addenda | 0x115 |
+| UPC-E 2 Char Addenda | 0x116 |
+| UPC-E 5 Char Addenda | 0x117 |
+| EAN13 2 Char Addenda | 0x118 |
+| EAN13 5 Char Addenda | 0x119 |
+| EAN8 2 Char Addenda | 0x11a |
+| EAN8 5 Char Addenda | 0x11b |
+| Code 128 | 0x121 |
+| Code 128 Minimum Length | 0x122 |
+| Code 128 Maximum Length | 0x123 |
+| ISBT 128 | 0x124 |
+| GS1-128 | 0x125 |
+| ISBT 128 Predefined Concatenation Sequences On/Off | 0x126 |
+| Code 39 | 0x131 |
+| Trioptic Code 39 | 0x132 |
+| Code 39 Full ASCII | 0x133 |
+| Convert Code 39 to Code 32 | 0x134 |
+| Code 32 Prefix | 0x135 |
+| Code 39 Minimum Length | 0x136 |
+| Code 39 Maximum Length | 0x137 |
+| Transmit Code 39 Check Digit | 0x138 |
+| Code 39 Check Digit Verification | 0x139 |
+| Transmit Code 39 Start/Stop Characters | 0x13a |
+| Code 39 Quiet Zone | 0x13b |
+| Code 93 | 0x141 |
+| Code 93 Minimum Length | 0x142 |
+| Code 93 Maximum Length | 0x143 |
+| Code 11 | 0x151 |
+| Code 11 Minimum Length | 0x152 |
+| Code 11 Maximum Length | 0x153 |
+| Code 11 Check Digit Verification | 0x154 |
+| Transmit Code 11 Check Digit | 0x155 |
+| Interleaved 2 of 5 | 0x161 |
+| Interleaved 2 of 5 Minimum Length | 0x162 |
+| Interleaved 2 of 5 Maximum Length | 0x163 |
+| Discrete 2 of 5 | 0x171 |
+| Discrete 2 of 5 Minimum Length | 0x172 |
+| Discrete 2 of 5 Maximum Length | 0x173 |
+| Chinese 2 of 5 | 0x181 |
+| Chinese 2 of 5 Minimum Length | 0x182 |
+| Chinese 2 of 5 Maximum Length | 0x183 |
+| Codabar | 0x191 |
+| Codabar Minimum Length | 0x192 |
+| Codabar Maximum Length | 0x193 |
+| Transmit Codabar Start/Stop Characters | 0x194 |
+| MSI | 0x201 |
+| MSI Minimum Length | 0x202 |
+| MSI Maximum Length | 0x203 |
+| RSS 14 | 0x211 |
+| RSS limit | 0x212 |
+| RSS expanded | 0x213 |
+| Convert RSS to UPC/EAN | 0x214 |
+| QR Code | 0x221 |
+| QR Code Minimum Length | 0x222 |
+| QR Code Maximum Length | 0x223 |
+| QR Inverse | 0x224 |
+| MicroQR | 0x225 |
+| Data Matrix | 0x231 |
+| Data Matrix Minimum Length | 0x232 |
+| Data Matrix Maximum Length | 0x233 |
+| Data Matrix Inverse | 0x234 |
+| Data Matrix Decode Mirror Images | 0x235 |
+| China Post | 0x241 |
+| China Post Minimum Length | 0x242 |
+| China Post Maximum Length | 0x243 |
+| Matrix 2 of 5 | 0x251 |
+| Matrix 2 of 5 Minimum Length | 0x252 |
+| Matrix 2 of 5 Maximum Length | 0x253 |
+| US Postnet | 0x261 |
+| US Planet | 0x262 |
+| British Post | 0x263 |
+| Japanese Post | 0x264 |
+| Australian Post | 0x265 |
+| UPU FICS Postal | 0x266 |
+| USPS 4CB/One Code/Intelligent Mail | 0x267 |
+| KIX(Netherlands) Post | 0x268 |
+| Transmit US Postal Check Digit | 0x269 |
+| Transmit Planet Check Digit | 0x26a |
+| Korean 2 of 5 | 0x271 |
+| EAN UCC Composite | 0x2b1 |
+| EAN UCC Composite Minimum Length | 0x2b2 |
+| EAN UCC Composite Maximum Length | 0x2b3 |
+| PDF417 | 0x2c1 |
+| PDF417 Minimum Length | 0x2c2 |
+| PDF417 Maximum Length | 0x2c3 |
+| Micro PDF417 | 0x2d1 |
+| Micro PDF417 Minimum Length | 0x2d2 |
+| Micro PDF417 Maximum Length | 0x2d3 |
+| MaxiCode | 0x2e1 |
+| MaxiCode Minimum Length | 0x2e2 |
+| MaxiCode Maximum Length | 0x2e3 |
+| Aztec Code | 0x2f1 |
+| Aztec Code Minimum Length | 0x2f2 |
+| Aztec Code Maximum Length | 0x2f3 |
+| Aztec Inverse | 0x2f4 |
+| Codablock | 0x301 |
+| Codablock Minimum Length | 0x302 |
+| Codablock Maximum Length | 0x303 |
+| Telepen | 0x311 |
+| Telepen Minimum Length | 0x312 |
+| Telepen Maximum Length | 0x313 |
+| Telepen Old Syle Mode | 0x314 |
+| Set Default Parameter | 0x321 |
+| Set Code Charset | 0x322 |
+| OCR | 0x331 |
+| Set OCR Template | 0x332 |
+| Composite CC-C | 0x341 |
+| Composite CC-A/B | 0x342 |
+| Composite TLC-39 | 0x343 |
+| UPC Composite | 0x344 |
+| Transmit Code ID Character | 0x351 |
+| Grid Matrix | 0x361 |
+
+> 各扫描头参数详细信息见:扫描头条码参数汇总(仅供内部使用)
+
+## 扫描状态参数
+
+| Status | Status Number (Hex) |
+| --- | --- |
+| Decode Complete | 0x00 |
+| Decode Time Out | 0x01 |
+| Decode has been Canceled | 0x02 |
+| Some Errors Happened | 0x03 |
+| Decode Event | 0x04 |
diff --git a/docs/Android扫描服务设置.md b/docs/Android扫描服务设置.md
new file mode 100644
index 0000000..ca503a1
--- /dev/null
+++ b/docs/Android扫描服务设置.md
@@ -0,0 +1,449 @@
+# Android 扫描服务接口设置
+
+> 江苏东大集成电路系统工程技术有限公司
+> www.seuic.com
+
+![SEUIC 东集 Logo 图片占位符]
+
+> **强烈建议修改广播名称**
+
+## 修订记录
+
+| 版本号 | 修订日期 | 修订内容 | 修订人员 |
+| --- | --- | --- | --- |
+| 1.0 | 2015/09/21 | 建立本文档 | 徐良伟 |
+| 1.1 | 2016/11/07 | 增加过滤条码首尾空格选项 | 罗涛 |
+| 1.2 | 2017/03/20 | 扫描特殊功能实现演示 | 罗涛 |
+| 1.3 | 2017/05/31 | 加入启用/禁用扫描头以及过滤不可见字符广播接口介绍 | 罗涛 |
+| 1.4 | 2017/07/18 | 修正条码参数设置广播接口 | 罗涛 |
+| 1.5 | 2018/4/3 | 加入开始/停止扫描广播接口 | 罗涛 |
+
+## 目录
+
+- 概述
+ - 硬件平台
+ - 软件平台
+ - 适用对象
+- 扫描服务应用设置
+ - 扫描声音开关
+ - 振动开关
+ - 连续扫描开关
+ - 时间间隔设置
+ - 条码前缀参数设置
+ - 条码后缀参数设置
+ - 开机自启动设置
+ - 条码结束符设置
+ - 条码发送方式
+ - 条码的广播设置
+ - 过滤首尾空格开关
+ - 条码参数设置
+ - 启用/禁用扫描头
+ - 过滤不可见字符
+ - 开始扫描
+ - 停止扫描
+- 扫描特殊功能实现
+ - 持续出光模式设置
+
+---
+
+# 概述
+
+东集提供的设备上内置了扫描服务,也提供了相应的设置软件。但部分客户有在自己的应用中定制扫描服务的需求。本文档介绍了如何通过接口来设置扫描服务的部分选项,以便帮助用户更灵活地使用我们的设备。
+
+## 硬件平台
+
+SDK 适用于以下终端设备:
+
+- D500
+- D510
+- D330S
+- D500P
+- D510P
+- D330P
+- D700
+- D500F
+- D700P
+
+具体使用范围在函数接口说明中指明,若无指明表示都支持。
+
+## 软件平台
+
+SDK 基于 Android 4.3、Android 4.4、Android 5.1、Android 7.1 版本,支持 Eclipse、Android Studio 开发工具。
+
+## 适用对象
+
+希望在自己的应用中定制扫描服务的开发人员。
+
+---
+
+# 扫描服务应用设置
+
+扫描服务应用设置支持以下功能的设置:
+
+- 扫描声音开关
+- 振动开关
+- 连续扫描开关
+- 时间间隔设置
+- 条码前缀参数设置
+- 条码后缀参数设置
+- 开机自启动设置
+- 条码结束符设置
+- 条码发送方式
+- 条码的广播设置
+- 过滤条码首尾空格开关
+- 条码参数设置
+- 启用/禁用扫描头
+- 过滤不可见字符
+- 开始扫描
+- 停止扫描
+
+**版本需求:** 扫描应用 1.0.67 及以后,部分设置 1.0.69 及以后。
+
+- **1.0.67 支持**
+ - 扫描声音开关
+ - 振动开关
+ - 开机自启动设置
+ - 条码结束符设置
+ - 条码发送方式
+ - 条码的广播设置
+ - 启用/禁用扫描头
+
+- **1.0.69 支持**
+ - 连续扫描开关
+ - 时间间隔设置
+ - 条码前缀参数设置
+ - 条码后缀参数设置
+ - 条码参数设置
+
+- **1.1.3 支持**
+ - 过滤条码首尾空格开关
+ - 过滤不可见字符
+
+> **备注:** 支持在一条广播中进行多项设置。
+
+## 扫描声音开关
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `sound_play` |
+| 取值 | boolean 型,true 或 false |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("sound_play", true);
+sendBroadcast(intent);
+```
+
+## 振动开关
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `viberate` |
+| 取值 | boolean 型,true 或 false |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("viberate", false);
+sendBroadcast(intent);
+```
+
+## 连续扫描开关
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `scan_continue` |
+| 取值 | boolean 型,true 或 false |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("scan_continue", true);
+sendBroadcast(intent);
+```
+
+## 时间间隔设置
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `interval` |
+| 取值 | int 型 |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("interval", 3000);
+sendBroadcast(intent);
+```
+
+## 条码前缀参数设置
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `prefix` |
+| 取值 | String 型,默认为 `" "` |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("prefix", "");
+sendBroadcast(intent);
+```
+
+## 条码后缀参数设置
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `suffix` |
+| 取值 | String 型,默认为 `" "` |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("suffix", "");
+sendBroadcast(intent);
+```
+
+## 开机自启动设置
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `boot_start` |
+| 取值 | boolean 型,true 或 false |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("boot_start", true);
+sendBroadcast(intent);
+```
+
+## 条码结束符设置
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `endchar` |
+| 取值 | 在条码后面附加的结束符,字符串类型,注意大小写,支持以下几种:
`"ENTER"`:回车
`"TAB"`:TAB
`"SPACE"`:空格
`"NONE"`:无结束符 |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("endchar", "ENTER");
+sendBroadcast(intent);
+```
+
+## 结束符以 Enter 键发送
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `end_char_on_emu` |
+| 取值 | 结束符以 Enter 键发送:模拟按键模式下 |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("end_char_on_emu", true);
+sendBroadcast(intent);
+```
+
+## 条码发送方式
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `barcode_send_mode` |
+| 取值 | 扫描服务扫描到条码后的发送方式,字符串类型,注意大小写,支持以下几种:
`"FOCUS"`:焦点录入
`"BROADCAST"`:广播
`"EMUKEY"`:模拟按键
`"CLIPBOARD"`:剪贴板 |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("barcode_send_mode", "BROADCAST");
+sendBroadcast(intent);
+```
+
+## 条码的广播设置
+
+**条码广播名称**
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `action_barcode_broadcast` |
+| 取值 | 字符串类型,默认是:`"com.android.server.scannerservice.broadcast"` |
+
+**条码键值名称**
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `key_barcode_broadcast` |
+| 取值 | 字符串类型,默认是:`"scannerdata"` |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("action_barcode_broadcast", "com.android.server.scannerservice.broadcast");
+intent.putExtra("key_barcode_broadcast", "scannerdata");
+sendBroadcast(intent);
+```
+
+## 过滤首尾空格开关
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `filter_prefix_suffix_blank` |
+| 取值 | boolean 型,true 或 false |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("filter_prefix_suffix_blank", true);
+sendBroadcast(intent);
+```
+
+## 条码参数设置
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.seuic.scanner.action.PARAM_SETTINGS` |
+| extra1 | `number` |
+| 取值 | int 型 |
+| extra2 | `value` |
+| 取值 | int 型 |
+
+> 有关扫描参数详情请见:[Android 扫描接口文档(1.0)](./Android扫描接口文档.md)
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.seuic.scanner.action.PARAM_SETTINGS");
+intent.putExtra("number", 0x01);
+intent.putExtra("value", 30);
+sendBroadcast(intent);
+```
+
+## 启用/禁用扫描头
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.ENABLED` |
+| extra | `enabled` |
+| 取值 | boolean 型,true 或 false |
+
+**示例:**
+
+启用扫描头:
+
+```java
+Intent intent = new Intent("com.android.scanner.ENABLED");
+intent.putExtra("enabled", true);
+sendBroadcast(intent);
+```
+
+禁用扫描头:
+
+```java
+Intent intent = new Intent("com.android.scanner.ENABLED");
+intent.putExtra("enabled", false);
+sendBroadcast(intent);
+```
+
+## 过滤不可见字符
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.android.scanner.service_settings` |
+| extra | `filter_invisible_chars` |
+| 取值 | boolean 型,true 或 false |
+
+**示例:**
+
+```java
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("filter_invisible_chars", true);
+sendBroadcast(intent);
+```
+
+## 开始扫描
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.scan.onStartScan` |
+
+**示例:**
+
+开始出光扫描:
+
+```java
+Intent intent = new Intent("com.scan.onStartScan");
+sendBroadcast(intent);
+```
+
+## 停止扫描
+
+| 项目 | 内容 |
+| --- | --- |
+| action | `com.scan.onEndScan` |
+
+**示例:**
+
+停止出光扫描:
+
+```java
+Intent intent = new Intent("com.scan.onEndScan");
+sendBroadcast(intent);
+```
+
+## 相关常量定义
+
+```java
+private final String TYPE_KEYUP_TO_STOP_SCAN = "keyup_to_stop_scan"; // 抬起停止扫描
+private final String TYPE_ENDCHAR_ON_EMU = "end_char_on_emu"; // 结束符以模拟按键方式发送
+private final String TYPE_ENTER_EVENT = "end_event"; // 默认广播时条码后添加回车事件
+private final String TYPE_FILTER_INVISIBLE_CHARS = "filter_invisible_chars"; // 过滤不可见字符
+private final String TYPE_FILTER_PREFIX_SUFFIX_BLANK = "filter_prefix_suffix_blank"; // 过滤首尾空格
+```
+
+---
+
+# 扫描特殊功能实现
+
+## 持续出光模式设置
+
+**示例代码:**
+
+```java
+// 将连续扫描打开
+Intent intent = new Intent("com.android.scanner.service_settings");
+intent.putExtra("scan_continue", true);
+sendBroadcast(intent);
+
+// 设置条码参数持续出光为开
+Intent intentParam = new Intent("com.android.scanner.PARAM_SETTINGS");
+intent.putExtra("number", 0x0c);
+intent.putExtra("value", 1);
+sendBroadcast(intentParam);
+```
diff --git a/docs/D500_Android_SDK使用说明书.md b/docs/D500_Android_SDK使用说明书.md
new file mode 100644
index 0000000..37175cb
--- /dev/null
+++ b/docs/D500_Android_SDK使用说明书.md
@@ -0,0 +1,663 @@
+# D500 Android SDK 使用说明书
+
+> 江苏东大集成电路系统工程技术有限公司
+> www.seuic.com
+
+![SEUIC 东集 Logo 图片占位符]
+
+## 修订记录
+
+| 版本号 | 修订日期 | 修订内容 | 修订人员 |
+| --- | --- | --- | --- |
+| 0.0 | 2014/08/05 | 建立本文档 | 钱进 |
+| 0.1 | 2014/08/05 | 加入 keypad、touch 接口的说明 | 张松 |
+| 0.2 | 2014/08/08 | 更改文档模板,并按模板重写文档 | 徐良伟 |
+| 1.0 | 2014/08/09 | 加入"系统包的使用",并按 touch 新接口修改文档 | 徐良伟 |
+| 1.1 | 2014/09/02 | 加入 touch 新的接口说明 加入 misc 接口 | 魏启运 |
+| 1.2 | 2015/04/29 | 在 misc 接口中增加启用/禁用状态栏下拉的接口,增加卸载/加载外置 SD 卡的接口 | 张松 |
+| 1.3 | 2017/03/16 | 在 misc 接口中添加 Zigbee 及 Fingerprint 的访问接口 | 钱进 |
+| 1.4 | 2017/03/29 | 更新 Zigbee 和 Fingerprint 接口 | 徐良伟 |
+
+## 目录
+
+- 概述
+ - 硬件平台
+ - 软件平台
+ - 适用对象
+ - 系统包的使用
+- 触摸屏接口
+ - TouchService 类
+- 键盘接口
+ - KeypadService 类
+- Misc 接口
+ - Misc 类
+ - Zigbee 类
+ - Fingerprint 类
+ - Manager 类
+
+---
+
+# 概述
+
+本文档介绍了 D500 上提供的设备相关的包的使用说明,以便帮助用户更好的使用终端产品提供的特殊功能。
+
+## 硬件平台
+
+SDK 适用于以下终端设备:
+
+- D500
+- D510
+- D330S
+
+具体使用范围在函数接口说明中指明,若无指明表示都支持。
+
+## 软件平台
+
+SDK 基于 Android 4.3 版本,支持 eclipse 开发工具。
+
+## 适用对象
+
+除了 Android 的标准功能外,希望用到设备提供的增值功能的开发人员。这部分增值功能包括一维扫描、二维扫描、键盘特殊设置、触摸特殊设置等实用功能。
+
+## 系统包的使用
+
+如果接口中标明是系统包,表明该包是内置到系统中的,无需将该包加入到 apk 中。下面以键盘接口为例,来说明如何在 eclipse 中使用系统包。
+
+- 在工程目录下建一个 `libsref` 目录(目录名称可以任意指定),将 `keypad.jar` 拷贝到此目录下。
+- 在 eclipse 中选中工程,在菜单中选择 Project → Properties → Java Build Path,点击 **Add External JARS...** 按钮,选择刚才的 `keypad.jar`。这时可以在工程视图的 Referenced Libraries 下看到刚才我们引用的 `keypad.jar`,展开可以看到所有 `keypad.jar` 提供的包、类、函数、变量。
+- `AndroidManifest.xml` 中使用 `uses-library` 用包名来标示 `keypad.jar` 是引用包。
+
+```xml
+
+ ……
+
+```
+
+---
+
+# 触摸屏接口
+
+| 项目 | 内容 |
+| --- | --- |
+| 包名 | `com.seuic.touch` |
+| 包文件 | `touch.jar` |
+| 系统包 | 是 |
+| 包含的类 | `TouchService` |
+| 作用 | 提供触摸屏相关的控制接口 |
+
+## TouchService 类
+
+### 使用方法
+
+```java
+import com.seuic.touch.TouchService;
+TouchService touch = TouchService.getInstance();
+```
+
+### 函数接口
+
+| 函数 | 说明 |
+| --- | --- |
+| `getGloveMode` | 获取当前手套模式开关状态 |
+| `setGloveMode` | 设置手套模式开关 |
+| `getTouchEnabled` | 获取当前触屏使能状态 |
+| `setTouchEnabled` | 设置触摸屏使能开关 |
+| `getVirKeyDisabled` | 获取虚拟按键屏蔽状态(仅 D500 支持) |
+| `setVirKeyDisabled` | 设置虚拟按键屏蔽状态(仅 D500 支持) |
+
+#### 1. 获取当前手套模式开关状态
+
+```java
+int getGloveMode()
+```
+
+**参数:** 无
+
+**返回值:** 返回手套模式状态,有以下几种:
+
+| 状态 | 值 | 说明 |
+| --- | --- | --- |
+| `MODE_GLOVE_OFF` | 0 | 手套模式关闭 |
+| `MODE_GLOVE_ON` | 1 | 手套模式打开 |
+| | <0 | 触摸接口不正常,或该设备不支持手套模式设置 |
+
+#### 2. 设置手套模式开关
+
+```java
+boolean setGloveMode(int mode)
+```
+
+**参数:**
+
+- `mode`:手套模式状态,见 `getGloveMode()` 函数返回值的说明。
+
+**返回值:** 返回 `true` 表示成功,`false` 表示失败。
+
+#### 3. 获取当前触摸屏使能状态
+
+```java
+int getTouchEnable()
+```
+
+**参数:** 无
+
+**返回值:** 返回触摸屏使能状态,有以下几种:
+
+| 状态 | 值 | 说明 |
+| --- | --- | --- |
+| `TOUCH_ENABLED_OFF` | 0 | 触摸屏处于锁屏状态 |
+| `TOUCH_ENABLED_ON` | 1 | 触摸屏处于正常使用状态 |
+| | <0 | 触摸接口不正常,或该设备不支持触摸屏使能设置 |
+
+#### 4. 设置触摸屏使能开关
+
+```java
+boolean setTouchEnabled(int enable, Context context)
+```
+
+**参数:**
+
+- `enable`:触摸屏使能状态,见 `getTouchEnabled()` 函数返回值的说明。
+- `context`:调用者的上下文,用于向系统广播锁屏通知,以便在通知栏显示当前锁屏状态。
+
+**返回值:** 返回 `true` 表示成功,`false` 表示失败。
+
+#### 5. 获取虚拟按键屏蔽状态
+
+```java
+int getVirKeyDisabled()
+```
+
+**参数:** 无
+
+**返回值:** 返回虚拟按键屏蔽状态,有以下几种:
+
+| 状态 | 值 | 说明 |
+| --- | --- | --- |
+| `VKEY1_DISABLE_MASK` | `1 << 0` | 虚拟键一被屏蔽 |
+| `VKEY2_DISABLE_MASK` | `1 << 1` | 虚拟键二被屏蔽 |
+| `VKEY3_DISABLE_MASK` | `1 << 2` | 虚拟键三键被屏蔽 |
+| `VKEY_ALL_DISABLE_MASK` | `0x7` | 所有虚拟按键均屏蔽 |
+| | 0 | 所有虚拟按键未被屏蔽 |
+| | <0 | 触摸接口不正常,或设备不支持触摸屏设置 |
+
+#### 6. 设置虚拟按键屏蔽状态
+
+```java
+boolean setVirKeyDisabled(int disableMask)
+```
+
+**参数:**
+
+- `disableMask`:虚拟按键屏蔽状态,见 `getVirKeyDisabled()` 函数返回值的说明。
+
+**返回值:** 返回 `true` 表示成功,`false` 表示失败。
+
+---
+
+# 键盘接口
+
+| 项目 | 内容 |
+| --- | --- |
+| 包名 | `com.seuic.keypad` |
+| 包文件 | `keypad.jar` |
+| 系统包 | 是 |
+| 包含的类 | `KeypadService` |
+| 作用 | 提供键盘相关的控制接口 |
+
+## KeypadService 类
+
+### 使用方法
+
+```java
+import com.seuic.keypad.KeypadService;
+KeypadService keypad = KeypadService.getInstance();
+```
+
+### 函数接口
+
+| 函数 | 说明 |
+| --- | --- |
+| `getMode` | 获取键盘模式(仅 D500 支持) |
+| `setMode` | 设置键盘模式(仅 D500 支持) |
+
+#### 1. 获取键盘模式
+
+```java
+int getMode()
+```
+
+**参数:** 无
+
+**返回值:** 返回键盘功能键模式,有以下几种:
+
+| 状态 | 值 | 说明 |
+| --- | --- | --- |
+| `MODE_NORMAL` | 0 | 标准模式。根据当前 Num、Fn 的状态灯输出数字或功能键。 |
+| `MODE_STICK_ONCE` | 1 | Fn 键只粘滞一次模式。当处于 Fn 状态时,按一下按键输出功能键,然后自动切换到 Num 模式。 |
+| | <0 | 键盘接口不正常,或该设备不支持键盘模式设置 |
+
+#### 2. 设置键盘模式
+
+```java
+boolean setMode(int mode)
+```
+
+**参数:**
+
+- `mode`:键盘模式状态,见 `getMode()` 函数返回值的说明。
+
+**返回值:** 返回 `true` 表示成功,`false` 表示失败。
+
+---
+
+# Misc 接口
+
+| 项目 | 内容 |
+| --- | --- |
+| 包名 | `com.seuic.misc` |
+| 包文件 | `misc.jar` |
+| 系统包 | 是 |
+| 包含的类 | `Misc` |
+| 作用 | 提供系统其它接口 |
+
+## Misc 类
+
+### 使用方法
+
+```java
+import com.seuic.misc.Misc;
+Misc misc = new Misc();
+```
+
+### 函数接口
+
+| 函数 | 说明 |
+| --- | --- |
+| `getSN` | 获取设备 SN |
+| `getStatusBarEnabled` | 获取系统状态栏是否允许下拉的状态 |
+| `setStatusBarEnabled` | 设置系统状态栏是否允许下拉 |
+| `getExtSDCardMounted` | 获取外置 SD 卡是否卸载 |
+| `setExtSDCardMounted` | 设置外置 SD 卡卸载或加载 |
+| `getCustomId` | 获取用户自定义序列号。仅支持 D700_V1.6.0 及之后版本,D700C_V1.2.0 及之后版本,D700P_V1.1.2 及之后版本。 |
+
+#### 1. 获取设备 SN
+
+```java
+String getSN()
+```
+
+**参数:** 无
+
+**返回值:** 返回厂家定义的 SN 号,有以下几种:
+
+| 状态 | 值 | 说明 |
+| --- | --- | --- |
+| null | null | 获取 SN 失败 |
+| String 类型 | String 类型 | 获取成功 |
+
+#### 2. 获取系统状态栏是否允许下拉的状态
+
+```java
+int getStatusBarEnabled(Context context)
+```
+
+**参数:**
+
+- `context`:上下文。
+
+**返回值:** 返回状态栏是否允许下拉的状态,如下:
+
+| 状态 | 值 | 说明 |
+| --- | --- | --- |
+| `STATUSBAR_DISABLED` | 0 | 系统状态栏不允许下拉。 |
+| `STATUSBAR_ENABLED` | 1 | 系统状态栏允许下拉。 |
+| | <0 | 接口不正常,或该设备不支持系统状态栏的设置。 |
+
+#### 3. 设置系统状态栏是否允许下拉
+
+```java
+void setStatusBarEnabled(Context context, int enable)
+```
+
+**参数:**
+
+- `context`:上下文。
+- `enable`:状态栏是否允许下拉,取值见 `getStatusBarEnabled()` 返回值。
+
+**返回值:** 无
+
+#### 4. 获取外置 SD 卡是否卸载
+
+```java
+int getExtSDCardMounted(Context context)
+```
+
+**参数:**
+
+- `context`:上下文。
+
+**返回值:** 返回外置 SD 卡的状态,如下:
+
+| 状态 | 值 | 说明 |
+| --- | --- | --- |
+| `EXT_SDCARD_UNMOUNTED` | 0 | 外置 SD 卡卸载。 |
+| `EXT_SDCARD_MOUNTED` | 1 | 外置 SD 卡未卸载。 |
+| | <0 | 接口不正常,或该设备不支持外置 SD 卡的卸载。 |
+
+#### 5. 设置外置 SD 卡卸载或装载
+
+```java
+void setExtSDCardMounted(Context context, int enable)
+```
+
+**参数:**
+
+- `context`:上下文。
+- `enable`:设置外置 SD 卡的卸载加载,取值见 `getExtSDCardMounted()` 返回值。
+
+**返回值:** 无
+
+#### 6. 获取用户自定义序列号
+
+```java
+String getCustomId()
+```
+
+**参数:** 无
+
+**返回值:** 返回用户自定义序列号,**仅 D700 系列支持,其它项目请勿调用此函数,会异常**。
+
+返回值有以下几种:
+
+| 状态 | 值 | 说明 |
+| --- | --- | --- |
+| null | null | 获取用户自定义序列号失败 |
+| String 类型 | String 类型 | 获取成功 |
+
+## Zigbee 类
+
+### 使用方法
+
+```java
+import com.seuic.misc.Zigbee;
+Zigbee zigbee = new Zigbee();
+```
+
+### 操作流程
+
+参考流程:`open` → `powerOn` → `read & write` → `powerOff` → `close`
+
+该类提供的函数可以分为两组,一组是用于模块的上电/断电,一组用于串口的操作。模块的上电和串口打开谁先谁后并没有严格的顺序,视具体设备要求。
+
+### 函数接口
+
+| 函数 | 说明 |
+| --- | --- |
+| `getDeviceName` | 获取设备名称 |
+| `powerOn` | 设备上电 |
+| `powerOff` | 设备断电 |
+| `open` | 打开设备,包括打开串口,不包括上电 |
+| `close` | 关闭设备,包括关闭串口,不包括断电 |
+| `read` | 封装对设备的读操作 |
+| `write` | 封装对设备的写操作 |
+
+#### 1. 获取设备名称
+
+```java
+public String getDeviceName()
+```
+
+**参数:** 无
+
+**返回值:** 该设备连接的串口设备文件,如 `/dev/ttyUART0`
+
+#### 2. 设备上电
+
+```java
+public void powerOn()
+```
+
+**参数:** 无
+
+**返回值:** 无
+
+#### 3. 设备断电
+
+```java
+public void powerOff()
+```
+
+**参数:** 无
+
+**返回值:** 无
+
+#### 4. 打开设备,包括打开串口
+
+```java
+public boolean open()
+public boolean open(int baudrate)
+public boolean open(int baudrate, int dataBits, int stopBits, int parity)
+```
+
+**参数:**
+
+- `baudrate`:波特率,如 `115200`
+- `dataBits`:数据位,目前支持 `5`、`6`、`7`、`8`
+- `stopBits`:停止位,目前支持 `1`、`2`
+- `parity`:奇偶校验
+ - `'n'` 或 `'N'`:无奇偶校验
+ - `'o'` 或 `'O'`:奇校验
+ - `'e'` 或 `'E'`:偶校验
+ - `'m'` 或 `'M'`:标记检验
+ - `'s'` 或 `'S'`:空白校验
+
+**返回值:** 成功或失败
+
+**备注:** 提供 3 个 `open` 接口简化串口的参数设置,默认串口 115200,8 位数据位,1 位停止位,无奇偶校验。用户可以根据实际情况选择相应的接口。
+
+#### 5. 关闭设备,包括关闭串口
+
+```java
+public void close()
+```
+
+**参数:** 无
+
+**返回值:** 无
+
+#### 6. 封装对设备的读操作
+
+```java
+public byte[] read(int len, int timeout)
+```
+
+**参数:**
+
+| 参数 | 类型 | 说明 |
+| --- | --- | --- |
+| `len` | int | 要读取的长度 |
+| `timeout` | int | 超时,单位毫秒 |
+
+**返回值:** 读取到的字节数组,失败的话返回 `null`
+
+#### 7. 封装对设备的写操作
+
+```java
+public boolean write(byte[] data, int len)
+```
+
+**参数:**
+
+| 参数 | 类型 | 说明 |
+| --- | --- | --- |
+| `data` | byte[] | 要写入设备的字节数组 |
+| `len` | int | 要写入的长度,应当 <= data 的实际长度 |
+
+**返回值:** 成功或失败
+
+## Fingerprint 类
+
+### 使用方法
+
+```java
+import com.seuic.misc.Fingerprint;
+Fingerprint fingerprint = new Fingerprint();
+```
+
+### 操作流程
+
+`open` → `powerOn` → `read & write` → `powerOff` → `close`
+
+> 有的指纹模块可能需要先 `powerOn` 再 `open`,请和模块厂家确认。
+
+该类提供的函数可以分为两组,一组是用于模块的上电/断电,一组用于串口的操作。模块的上电和串口打开谁先谁后并没有严格的顺序,视具体设备要求。
+
+### 函数接口
+
+| 函数 | 说明 |
+| --- | --- |
+| `getDeviceName` | 获取设备名称 |
+| `powerOn` | 设备上电 |
+| `powerOff` | 设备断电 |
+| `open` | 打开设备,包括打开串口,不包括上电 |
+| `close` | 关闭设备,包括关闭串口,不包括断电 |
+| `read` | 封装对设备的读操作 |
+| `write` | 封装对设备的写操作 |
+
+#### 1. 获取设备名称
+
+```java
+public String getDeviceName()
+```
+
+**参数:** 无
+
+**返回值:** 该设备连接的串口设备文件,如 `/dev/ttyUART0`
+
+#### 2. 设备上电
+
+```java
+public void powerOn()
+```
+
+**参数:** 无
+
+**返回值:** 无
+
+#### 3. 设备断电
+
+```java
+public void powerOff()
+```
+
+**参数:** 无
+
+**返回值:** 无
+
+#### 4. 打开设备,包括打开串口
+
+```java
+public boolean open()
+public boolean open(int baudrate)
+public boolean open(int baudrate, int dataBits, int stopBits, int parity)
+```
+
+**参数:**
+
+- `baudrate`:波特率,如 `115200`
+- `dataBits`:数据位,目前支持 `5`、`6`、`7`、`8`
+- `stopBits`:停止位,目前支持 `1`、`2`
+- `parity`:奇偶校验
+ - `'n'` 或 `'N'`:无奇偶校验
+ - `'o'` 或 `'O'`:奇校验
+ - `'e'` 或 `'E'`:偶校验
+ - `'m'` 或 `'M'`:标记检验
+ - `'s'` 或 `'S'`:空白校验
+
+**返回值:** 成功或失败
+
+**备注:** 提供 3 个 `open` 接口简化串口的参数设置,默认串口 115200,8 位数据位,1 位停止位,无奇偶校验。用户可以根据实际情况选择相应的接口。
+
+#### 5. 关闭设备,包括关闭串口
+
+```java
+public void close()
+```
+
+**参数:** 无
+
+**返回值:** 无
+
+#### 6. 封装对设备的读操作
+
+```java
+public byte[] read(int len, int timeout)
+```
+
+**参数:**
+
+| 参数 | 类型 | 说明 |
+| --- | --- | --- |
+| `len` | int | 要读取的长度 |
+| `timeout` | int | 超时,单位毫秒 |
+
+**返回值:** 读取到的字节数组,失败的话返回 `null`
+
+#### 7. 封装对设备的写操作
+
+```java
+public boolean write(byte[] data, int len)
+```
+
+**参数:**
+
+| 参数 | 类型 | 说明 |
+| --- | --- | --- |
+| `data` | byte[] | 要写入设备的字节数组 |
+| `len` | int | 要写入的长度,应当 <= data 的实际长度 |
+
+**返回值:** 成功或失败
+
+## Manager 类
+
+### 使用方法
+
+```java
+import com.seuic.misc.Manager;
+Manager manager = new Manager(context);
+```
+
+### 函数接口
+
+| 函数 | 说明 |
+| --- | --- |
+| `enableUsb` | 使能/禁用 USB。使能状态下,usb 才可以设置为 mtp/ptp/U 盘模式。仅支持 D700_V1.6.0 及之后版本。 |
+| `isUsbEnabled` | 查看 USB 使能状态。仅支持 D700_V1.6.0 及之后版本。 |
+
+#### 1. 使能/禁用 USB
+
+```java
+public boolean enableUsb(boolean enable)
+```
+
+**参数:**
+
+- `enable`:
+ - `true`:使能
+ - `false`:禁用
+
+**返回值:** 设置是否成功。
+
+#### 2. 查看 USB 使能状态
+
+```java
+public boolean isUsbEnabled()
+```
+
+**参数:** 无
+
+**返回值:** `true` 表示使能,`false` 表示禁用。默认是使能状态。