# flutter_plugin_pda_scanner
**Repository Path**: zengxingshun/flutter_plugin_pda_scanner
## Basic Information
- **Project Name**: flutter_plugin_pda_scanner
- **Description**: 一款基于Flutter开发的支持多种PDA扫码的插件
- **Primary Language**: Dart
- **License**: MIT
- **Default Branch**: master
- **Homepage**: https://gitee.com/zengxingshun/flutter_plugin_pda_scanner/blob/master/README.md
- **GVP Project**: No
## Statistics
- **Stars**: 13
- **Forks**: 4
- **Created**: 2024-01-17
- **Last Updated**: 2025-06-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Flutter, pda, Android, Kotlin
## README
flutter_plugin_pda_scanner v3.0.5
一款基于Flutter开发的支持多种PDA扫码的插件
#### [README DOCS FOR ENGLISH](https://github.com/JeromeTseng/flutter_plugin_pda_scanner/blob/master/README_en.md)
# 一、介绍 ✨
这是一款专为Flutter开发者设计的PDA扫码插件,支持多种品牌和型号的PDA设备,包括但不限于斑马、海康威视、远望谷、思必拓和东集seuic等。插件提供了自动和手动两种初始化方式,以适应不同的开发需求和场景。
### 🔹特点:
- **多设备支持**:经过测试,兼容多款主流PDA设备。
- **广播监听**:支持通过广播行为手动注册监听PDA扫码。
- **事件监听**:通过tag区分,可以同时监听多个扫码事件。
- **API丰富**:提供多种API,包括初始化、监听、关闭扫码器等。
- **声音提示**:包含成功、失败的声音提示功能。
### 🔹使用方法:
1. **安装**:通过`pubspec.yaml`添加依赖。
2. **导入**:在Flutter项目中导入`flutter_plugin_pda_scanner`包。
3. **初始化**:在`main`函数中初始化插件,并使用`await`等待完成。
4. **监听事件**:通过`on`方法设置事件监听,使用tag作为标识。
5. **取消监听**:使用`off`方法取消特定tag的监听或`offAll`取消所有监听。
已测试的型号有:
```text
斑马:MC3300x
海康威视(Hikivision):DS-MDT201
远望谷:不明确
思必拓:T60
东集seuic:CRUISE2 5G
...
同时支持根据广播行为手动注册广播监听PDA扫码
```
**_可先 [下载](https://gitee.com/zengxingshun/flutter_plugin_pda_scanner/releases/download/V3.0.5/pda_scanner-V3.0.5.apk) 示例 app 进行测试,如需要集成 native 方式扫码的 PDA,请加我微信反馈,欢迎 fork 及 pr 。_**
|
|
|
|
|:--------------------------------------------------:|:--------------------------------------------------------:|:-----------------------------------------------------------:|
➡ **如果是集成蓝牙扫码枪/USB扫码枪,请移步至另一个优秀开源库:[liyufengrex/flutter_scan_gun: flutter:usb 即插款扫码枪通用方案。](https://github.com/liyufengrex/flutter_scan_gun)**
# 二、使用方式 📔
## 1. 安装
将以下内容添加到你的 `pubspec.yaml` 文件中
```yaml
dependencies:
flutter_plugin_pda_scanner: ^3.0.5
```
## 2. 导入
```dart
import 'package:flutter_plugin_pda_scanner/pda_utils.dart';
```
## 3. 初始化
* ### 自动初始化
```dart
// 请在main函数的runApp调用之前初始化
void main() async {
await PdaUtils.init();
runApp(const MyApp());
}
// 监听事件 可以监听多个事件 用tag进行区分
PdaUtils.on("tag", (barcode) {
// 接收回调的条码...
});
// 取消tag上的监听
PdaUtils.off("tag");
```
* ### 手动初始化
```dart
// 传入广播action 和要获取的数据标签 label
await PdaUtils.initByCustom("com.action.scannersrvice...","data");
// 监听事件 可以监听多个事件 用tag进行区分
PdaUtils.on("tag", (barcode) {
// 接收回调的条码...
});
// 取消tag上的监听
PdaUtils.off("tag");
```
🔷 **_这里的tag相当于一个id,每个界面定义一个唯一的标识,相当于标记哪个界面监听了扫码事件,页面销毁时也根据这个id取消监听,避免内存泄漏。_**
🔷 **_条码内容会经过处理,首尾的空白字符(换行符、制表符、空格)都会被替换成空字符串,但是字符中间的空白字符不会替换_**
## 4. Api详情
| api | 说明 | 调用示例 |
|------------------------|-------------------------------------------------------------------------------------------------------|--------------------------------------------|
| init | 初始化PDA插件,在runApp方法之前调用,注意:该方法内有大量异步操作,请结合await等待init操作完成。
| await PdaUtils.init(); |
| initByCustom | 手动初始化PDA插件
action:广播行为
label:扫码内容获取标签
| await PdaUtils.initByCustom(action,label); |
| getInitLogList | 获取初始化日志 | PdaUtils.getInitLogList(); |
| isThisPDASupported | 该PDA设备是否支持扫码 | PdaUtils.isThisPDASupported(); |
| getPDAModel | 获取设备型号名称 | PdaUtils.getPDAModel(); |
| getPlatformVersion | 获取安卓系统版本 | PdaUtils.getPlatformVersion(); |
| on | 监听扫码事件,每次扫码事件传入tag字符串作为独立监听标识
| PdaUtils.on('tag',(barcode){...}); |
| getOnTagList | 获取订阅的tag标识列表 | PdaUtils.getOnTagList(); |
| off | 取消对tag上的监听 | PdaUtils.off('tag'); |
| offAll | 取消所有监听事件 | PdaUtils.offAll(); |
| errorSoundDudu | 嘟嘟警告提示音 | PdaUtils.errorSoundDudu(); |
| successSoundHumanVoice | 扫码成功的人声提示 | PdaUtils.successSoundHumanVoice(); |
| errorSoundHumanVoice | 扫码失败的人声提示,可传入bool类型参数playErrorSoundDudu,即播放失败人声时是否播放嘟嘟警告提示音,该参数默认为true
| PdaUtils.errorSoundHumanVoice(); |
| navigateToSystemHome | 返回系统桌面,原生返回系统桌面后再进入app时会重启app,返回系统桌面时拦截调用该方法后不会有该情况
| PdaUtils.navigateToSystemHome(); |
| closeScanner | 手动关闭扫码器 | PdaUtils.closeScanner(); |
## 5. PDA扫码示例
```dart
import 'package:flutter/material.dart';
import 'package:flutter_plugin_pda_scanner/pda_utils.dart';
void main() async {
// 初始化PDA扫码 加上await关键字等待初始化完成
await PdaUtils.init();
runApp(MaterialApp(
title: 'PDA扫码示例',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(title: 'PDA扫码示例'),
));
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
bool _dialogShow = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme
.of(context)
.colorScheme
.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
// 监听事件 可以监听多个事件 用tag进行区分
PdaUtils.on("tag", (barcode) {
showDialogFunction(context, barcode);
});
},
child: const Text("监听扫码事件"),
),
ElevatedButton(
onPressed: () {
// 取消监听
PdaUtils.off("tag");
},
child: const Text("取消监听扫码事件"),
)
],
),
),
);
}
/// showDialog
showDialogFunction(BuildContext context, String barcode) async {
if (_dialogShow) {
_dialogShow = false;
Navigator.of(context).pop();
}
_dialogShow = true;
await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("条码内容"),
content: Text(barcode),
);
},
);
_dialogShow = false;
}
}
```
# 三、额外说明【斑马ZEBRA】 ⚡
**_ZEBRA(斑马)的 PDA 发生闪退或其他情况则需要做以下额外配置,您需要在您Flutter项目的安卓目录下的
AndroidManifest.xml 中加入以下内容_**
### 1、在 `manifest` 节点下加入
```xml
```
### 2、在 `application` 节点下加入
```xml
```
### 3、在项目\android\app下新建 libs 文件夹
将 `emdk-11.0.129.jar` 放入该文件夹中,可在zebra官方进行下载 或者在我提供的assets中进行下载。
在项目app下的build.gradle文件的dependencies下添加
```groovy
// 斑马PDA
compileOnly files('libs/emdk-11.0.129.jar')
```
以下为Zebra相关问题:
[android - How to use Zebra EMDK in release build? - Stack Overflow](https://stackoverflow.com/questions/70899282/how-to-use-zebra-emdk-in-release-build)
[Zebra EMDK Setup - TechDocs](https://techdocs.zebra.com/emdk-for-android/latest/guide/setup/)
[Basic Scanning with Barcode API - TechDocs (zebra.com)](https://techdocs.zebra.com/emdk-for-android/11-0/tutorial/tutbasicscanningapi/)
# 四、打包异常说明 💥
**如果在运行 `flutter build apk`出现如下异常**
```text
ERROR: Missing classes detected while running R8. Please add the missing classes or apply additional keep rules that are generated in [your_flutter_project]\build\app\outputs\mapping\release\missing_rules.txt.
ERROR: R8: Missing class com.symbol.emdk.EMDKBase (referenced from: void io.github.jerometseng.pdascanner.pda_type.zebra.ZebraConfig.onOpened(com.symbol.emdk.EMDKManager))
Missing class com.symbol.emdk.EMDKManager$EMDKListener (referenced from: void io.github.jerometseng.pdascanner.pda_type.zebra.ZebraConfig.open() and 1 other context)
Missing class com.symbol.emdk.EMDKManager$FEATURE_TYPE (referenced from: void io.github.jerometseng.pdascanner.pda_type.zebra.ZebraConfig.close() and 2 other contexts)
Missing class com.symbol.emdk.EMDKManager (referenced from: com.symbol.emdk.EMDKManager io.github.jerometseng.pdascanner.pda_type.zebra.ZebraConfig.emdkManager and 4 other contexts)
Missing class com.symbol.emdk.EMDKResults$STATUS_CODE (referenced from: void io.github.jerometseng.pdascanner.pda_type.zebra.ZebraConfig.open())
Missing class com.symbol.emdk.EMDKResults (referenced from: void io.github.jerometseng.pdascanner.pda_type.zebra.ZebraConfig.open())
......
FAILURE: Build failed with an exception.
```
**请在` [your_flutter_project]\android\app\proguard-rules.pro ` 文件中添加如下内容:**
```
-dontwarn com.symbol.emdk.**
```
如图:
