# 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**: 16
- **Forks**: 6
- **Created**: 2024-01-17
- **Last Updated**: 2025-09-23
## 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.**
```
如图:
