fqreader.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. library fqreader;
  2. import 'dart:async';
  3. import 'dart:io';
  4. import 'dart:typed_data';
  5. import 'package:flutter/foundation.dart';
  6. import 'package:flutter/gestures.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:flutter/rendering.dart';
  9. import 'package:flutter/services.dart';
  10. part "scan_view.dart";
  11. part 'zbar_view.dart';
  12. typedef ScanEvent = Future<bool> Function(ScanResult value);
  13. class Fqreader {
  14. static const MethodChannel _channel =
  15. const MethodChannel('fqreader');
  16. static Future<ScanResult?> decodeImg(File file,List<ScanType> scanType) async{
  17. var scanStr = <String>[];
  18. scanType.forEach((item){
  19. scanStr.add(item.toString());
  20. });
  21. List<int> data = file.readAsBytesSync();
  22. Uint8List uData = new Uint8List.fromList(data);
  23. var result = await _channel.invokeMethod('decodeImg',{
  24. "image": uData,
  25. "scanType": scanStr
  26. });
  27. if(result == null)
  28. return null;
  29. return ScanResult(
  30. scanType: _parseScanType(result['scanType']),
  31. data: result['data'],
  32. );
  33. }
  34. static Future<InitResult> _initView({
  35. required List<ScanType> scanType,
  36. double devicePixelRatio = 1
  37. }) async {
  38. var scanStr = <String>[];
  39. scanType.forEach((item){
  40. scanStr.add(item.toString());
  41. });
  42. final Map<dynamic,dynamic> result = await _channel.invokeMethod('initView',{
  43. "scanType": scanStr
  44. });
  45. return InitResult(
  46. cameraSize: Size(result['cameraWidth'] / devicePixelRatio, result['cameraHeight'] / devicePixelRatio),
  47. textureID: result['textureID']
  48. );
  49. }
  50. static Future _setScanRect(
  51. Rect scanRect,
  52. double devicePixelRatio) async{
  53. await _channel.invokeMethod('setScanRect',{
  54. "scanRect":{
  55. "left":(scanRect.left* devicePixelRatio).toInt(),
  56. "top":(scanRect.top* devicePixelRatio).toInt(),
  57. "right":(scanRect.right* devicePixelRatio).toInt(),
  58. "bottom":(scanRect.bottom* devicePixelRatio).toInt(),
  59. }});
  60. }
  61. static Future _startScan() async{
  62. await _channel.invokeMethod('startScan');
  63. }
  64. static Future _stopScan() async{
  65. await _channel.invokeMethod('stopScan');
  66. }
  67. static Future _turnOn() async{
  68. await _channel.invokeMethod("turnOn");
  69. }
  70. static Future _turnOff() async{
  71. await _channel.invokeMethod("turnOff");
  72. }
  73. static Future _release() async{
  74. await _channel.invokeMethod("release");
  75. }
  76. }
  77. class InitResult{
  78. final Size cameraSize;
  79. final int textureID;
  80. const InitResult({required this.cameraSize,required this.textureID});
  81. }
  82. class ScanResult{
  83. final String data;
  84. final ScanType? scanType;
  85. const ScanResult({required this.data,this.scanType});
  86. }
  87. enum ScanType{
  88. /// 所有条形码
  89. ALL,
  90. /// 普通二维码
  91. QR_CODE,
  92. /// 二维码 主要用于航空。比如坐飞机行李箱上贴的便签
  93. AZTEC,
  94. /// 条形码
  95. CODABAR,
  96. /// CODE 39 条形码
  97. CODE_39,
  98. /// CODE 92 条形码
  99. CODE_93,
  100. /// CODE 128 条形码
  101. CODE_128,
  102. /// 商品用条形码 EAN8
  103. EAN8,
  104. /// 商品用条形码 EAN13
  105. EAN13,
  106. /// 全球贸易货号。主要用于运输方面的条形码
  107. ITF,
  108. /// 一种二维码
  109. DATA_MATRIX,
  110. /// PDF417条码是一种高密度、高信息含量的便携式数据文件
  111. PDF_417,
  112. }
  113. ScanType _parseScanType(String str){
  114. switch(str){
  115. case 'ScanType.ALL':
  116. return ScanType.ALL;
  117. case 'ScanType.QR_CODE':
  118. return ScanType.QR_CODE;
  119. case 'ScanType.AZTEC':
  120. return ScanType.AZTEC;
  121. case 'ScanType.CODABAR':
  122. return ScanType.CODABAR;
  123. case 'ScanType.CODE_39':
  124. return ScanType.CODE_39;
  125. case 'ScanType.CODE_93':
  126. return ScanType.CODE_93;
  127. case 'ScanType.CODE_128':
  128. return ScanType.CODE_128;
  129. case 'ScanType.EAN8':
  130. return ScanType.EAN8;
  131. case 'ScanType.EAN13':
  132. return ScanType.EAN13;
  133. case 'ScanType.ITF':
  134. return ScanType.ITF;
  135. case 'ScanType.DATA_MATRIX':
  136. return ScanType.DATA_MATRIX;
  137. case 'ScanType.PDF_417':
  138. return ScanType.PDF_417;
  139. }
  140. throw new ArgumentError('未知类型');
  141. }