Flutter:如何使用Honeywell CK65安卓手持设备读取标准条码
针对Honeywell CK65 Flutter条码扫描的实现方案
方案一:快速测试(键盘Wedge模式)
CK65默认支持键盘Wedge模式——扫描后的条码内容会模拟键盘输入,直接填入当前获焦的输入框。这种方式无需额外依赖,适合快速验证扫描功能:
- 先确认设备设置:进入
Settings > Scanning > Scanner Input,选择Keyboard Wedge模式。 - 在Flutter项目中编写监听输入的代码:
import 'package:flutter/material.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('CK65条码测试')), body: const Center(child: BarcodeInput()), ), ); } } class BarcodeInput extends StatefulWidget { const BarcodeInput({super.key}); @override State<BarcodeInput> createState() => _BarcodeInputState(); } class _BarcodeInputState extends State<BarcodeInput> { final TextEditingController _controller = TextEditingController(); @override void initState() { super.initState(); // 监听输入变化,扫描完成后打印条码 _controller.addListener(() { final barcode = _controller.text.trim(); if (barcode.isNotEmpty) { print('扫描到条码: $barcode'); _controller.clear(); // 清空输入框,方便下次扫描 } }); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return TextField( controller: _controller, autofocus: true, // 自动获焦,确保扫描内容能输入进来 decoration: const InputDecoration( hintText: '扫描条码到此处', border: OutlineInputBorder(), ), // 若扫描后设备自动触发回车,可通过onSubmitted监听 onSubmitted: (value) { print('扫描完成: $value'); _controller.clear(); }, ); } }
方案二:专业集成(Honeywell Flutter插件)
如果需要更稳定的扫描控制(无需依赖输入框焦点、可自定义扫描类型),可以使用Honeywell官方适配的Flutter插件:
- 添加依赖到
pubspec.yaml:
dependencies: honeywell_scanner: ^2.0.0
执行flutter pub get完成依赖安装。
- 配置Android权限(CK65为Android设备):
在android/app/src/main/AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="com.honeywell.decode.permission.DECODE" />
- 编写扫描逻辑代码:
import 'package:flutter/material.dart'; import 'package:honeywell_scanner/honeywell_scanner.dart'; void main() => runApp(const MyApp()); class MyApp extends StatefulWidget { const MyApp({super.key}); @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> implements ScannerCallback { HoneywellScanner? scanner; String? scannedBarcode; @override void initState() { super.initState(); // 初始化扫描器 scanner = HoneywellScanner(this); // 配置扫描规则:仅启用标准条码,关闭二维码 scanner?.setProperties(ScannerProperties( code39Enabled: true, code128Enabled: true, upcAEnabled: true, upcEEnabled: true, qrCodeEnabled: false, )); } @override void onDecoded(String? result) { setState(() => scannedBarcode = result); print('扫描到条码: $result'); } @override void onError(Exception error) { print('扫描错误: ${error.toString()}'); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('CK65条码扫描')), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(scannedBarcode ?? '等待扫描...'), const SizedBox(height: 20), ElevatedButton( onPressed: () => scanner?.startScanner(), child: const Text('开始扫描'), ), ElevatedButton( onPressed: () => scanner?.stopScanner(), child: const Text('停止扫描'), ), ], ), ), ), ); } @override void dispose() { scanner?.stopScanner(); scanner?.dispose(); super.dispose(); } }
注意事项
- 测试前先用设备自带的扫描应用验证硬件功能是否正常;
- 键盘Wedge模式适合快速验证,插件模式更适合生产环境开发;
- 若使用插件,需确保CK65的系统版本满足插件要求(一般Android 8.0+即可)。
内容的提问来源于stack exchange,提问作者TheMortiestMorty
相关产品推荐
相关产品推荐

