fqreader.dart 4.1 KB

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