- 升级v1.2,支持自定义视图
ScanKit iOS SDK不支持armv7,只支持arm64,因此你需要在Xcode中配置, 看这里.
中文文档 | English
这是一个扫码的Flutter插件,它是HUAWEI ScanKit SDK的Flutter包。HUAWEI ScanKit 是一个强大的库,使用简单,对于模糊污损码识别率高,识码速度超快。
得益于华为在计算机视觉领域能力的积累,Scan Kit可以实现远距离码或小型码的检测和自动放大,同时针对常见复杂扫码场景(如反光、暗光、污损、模糊、柱面)做了针对性识别优化,提升扫码成功率与用户体验。
- Android
- iOS
Scan Kit支持扫描13种全球主流的码制式。如果您的应用只处理部分特定的码制式,您也可以在接口中指定制式以便加快扫码速度。已支持的码制式:
- 一维码:EAN-8、EAN-13、UPC-A、UPC-E、Codabar、Code 39、Code 93、Code 128、ITF-14
- 二维码:QR Code、Data Matrix、PDF417、Aztec
支持相机扫码和本地图片码识别。
- 配置权限
- 处理权限请求
- 调用API
将以下内容添加到ios/Runner/Info.plist
中
<key>NSCameraUsageDescription</key>
<string>在此向用户解释你为什么需要这个权限</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>在此向用户解释你为什么需要这个权限</string>
注意,替换<string></string>
标签的内容,给用户一个需要该权限的理由。
安卓平台不需要配置!
在Flutter中,你需要一个插件库来处理权限,这里推荐我的另一个插件库:flutter_easy_permission,详细配置请看 这里。
打开ios/Podfile
文件,添加如下配置:
target 'Runner' do
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
# Add the library of permissions you need here
pod 'EasyPermissionX/Camera'
pod 'EasyPermissionX/Photo'
end
然后执行命令进行安装。
void initState() {
super.initState();
scanKit = FlutterScankitPlus()
..addResultListen((val) {
// 返回识别结果
debugPrint("scanning result:$val");
});
FlutterEasyPermission().addPermissionCallback(
onGranted: (requestCode, perms,perm) {
startScan();
},
onDenied: (requestCode, perms,perm, isPermanent) {});
}
Scan the code:
// 如果没有权限则请求
if (!await FlutterEasyPermission.has(perms: _permissions,permsGroup: _permissionGroup)) {
FlutterEasyPermission.request(perms: _permissions,permsGroup: _permissionGroup);
} else {
// 有权限则调用
startScan();
}
Future<void> startScan() async {
try {
await scanKit.startScan(scanTypes: [ScanTypes.ALL]);
} on PlatformException {}
}
关于 FlutterEasyPermission
的用法,请查看这里 。
使用ScanKitWidget
作为扫码控件,ScanKitController
用于闪光灯切换、图片识码等功能
class _CustomizedViewState extends State<CustomizedView> {
late ScanKitController _controller;
final screenWidth = window.physicalSize.width;
final screenHeight = window.physicalSize.height;
@override
void dispose(){
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
var pixelSize = boxSize * window.devicePixelRatio;
var left = screenWidth/2 - pixelSize/2;
var top = screenHeight/2 - pixelSize/2;
var right = screenWidth/2 + pixelSize/2;
var bottom = screenHeight/2 + pixelSize/2;
var rect = Rect.fromLTRB(left, top, right, bottom);
return Scaffold(
body: SafeArea(
child: Stack(
children: [
/// 使用 ScanKitWidget 实现扫码,可自定义扫码页面视图
ScanKitWidget(
callback: (controller) {
_controller = controller;
controller.onResult.listen((result) {
debugPrint("scanning result:$result");
Navigator.of(context).pop(result);
});
},
continuouslyScan: false,
boundingBox: rect),
Align(
alignment: Alignment.topCenter,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
IconButton(
onPressed: () {
Navigator.of(context).pop();
},
icon: Icon(
Icons.arrow_back,
color: Colors.white,
size: 28,
)),
IconButton(
onPressed: () {
_controller.switchLight();
},
icon: Icon(
Icons.lightbulb_outline_rounded,
color: Colors.white,
size: 28,
)),
IconButton(
onPressed: () {
_controller.pickPhoto();
},
icon: Icon(
Icons.picture_in_picture_rounded,
color: Colors.white,
size: 28,
))
],
),
),
Align(
alignment: Alignment.center,
child: Container(
width: boxSize,
height: boxSize,
decoration: BoxDecoration(
border: Border(
left: BorderSide(color: Colors.orangeAccent, width: 2),
right: BorderSide(color: Colors.orangeAccent, width: 2),
top: BorderSide(color: Colors.orangeAccent, width: 2),
bottom: BorderSide(color: Colors.orangeAccent, width: 2)),
),
),
)
],
),
),
);
}
}
关于插件使用,可以参考我的两篇博客:
一个完整的例子,请看 这里。