fqreader.dart 4.1 KB

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