The QR Code Scanner package for Appeto SDK.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

166 lignes
6.5 KiB

  1. //
  2. // QRView.swift
  3. // flutter_qr
  4. //
  5. // Created by Julius Canute on 21/12/18.
  6. //
  7. import Foundation
  8. import MTBBarcodeScanner
  9. public class QRView:NSObject,FlutterPlatformView {
  10. @IBOutlet var previewView: UIView!
  11. var scanner: MTBBarcodeScanner?
  12. var registrar: FlutterPluginRegistrar
  13. var channel: FlutterMethodChannel
  14. var cameraFacing: MTBCamera
  15. public init(withFrame frame: CGRect, withRegistrar registrar: FlutterPluginRegistrar, withId id: Int64, params: Dictionary<String, Any>){
  16. self.registrar = registrar
  17. previewView = UIView(frame: frame)
  18. cameraFacing = MTBCamera.init(rawValue: UInt(Int(params["cameraFacing"] as! Double))) ?? MTBCamera.back
  19. channel = FlutterMethodChannel(name: "net.touchcapture.qr.flutterqr/qrview_\(id)", binaryMessenger: registrar.messenger())
  20. }
  21. deinit {
  22. scanner?.stopScanning()
  23. }
  24. public func view() -> UIView {
  25. channel.setMethodCallHandler({
  26. [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
  27. switch(call.method){
  28. case "setDimensions":
  29. let arguments = call.arguments as! Dictionary<String, Double>
  30. self?.setDimensions(width: arguments["width"] ?? 0, height: arguments["height"] ?? 0, scanArea: arguments["scanArea"] ?? 0)
  31. case "startScan":
  32. self?.startScan(result)
  33. case "flipCamera":
  34. self?.flipCamera()
  35. case "toggleFlash":
  36. self?.toggleFlash()
  37. case "pauseCamera":
  38. self?.pauseCamera()
  39. case "resumeCamera":
  40. self?.resumeCamera()
  41. default:
  42. result(FlutterMethodNotImplemented)
  43. return
  44. }
  45. })
  46. return previewView
  47. }
  48. func setDimensions(width: Double, height: Double, scanArea: Double) -> Void {
  49. previewView.frame = CGRect(x: 0, y: 0, width: width, height: height)
  50. let midX = self.view().bounds.midX
  51. let midY = self.view().bounds.midY
  52. if let sc: MTBBarcodeScanner = scanner {
  53. if let previewLayer = sc.previewLayer {
  54. previewLayer.frame = previewView.bounds;
  55. }
  56. } else {
  57. scanner = MTBBarcodeScanner(previewView: previewView)
  58. if (scanArea != 0) {
  59. scanner?.didStartScanningBlock = {
  60. self.scanner?.scanRect = CGRect(x: Double(midX) - (scanArea / 2), y: Double(midY) - (scanArea / 2), width: scanArea, height: scanArea)
  61. }
  62. }
  63. }
  64. }
  65. func startScan(_ result: @escaping FlutterResult) -> Void {
  66. scanner = MTBBarcodeScanner(previewView: previewView)
  67. MTBBarcodeScanner.requestCameraPermission(success: { permissionGranted in
  68. if permissionGranted {
  69. do {
  70. try self.scanner?.startScanning(with: self.cameraFacing, resultBlock: { [weak self] codes in
  71. if let codes = codes {
  72. for code in codes {
  73. var typeString: String;
  74. switch(code.type) {
  75. case AVMetadataObject.ObjectType.aztec:
  76. typeString = "AZTEC"
  77. case AVMetadataObject.ObjectType.code39:
  78. typeString = "CODE_39"
  79. case AVMetadataObject.ObjectType.code93:
  80. typeString = "CODE_93"
  81. case AVMetadataObject.ObjectType.code128:
  82. typeString = "CODE_128"
  83. case AVMetadataObject.ObjectType.dataMatrix:
  84. typeString = "DATA_MATRIX"
  85. case AVMetadataObject.ObjectType.ean8:
  86. typeString = "EAN_8"
  87. case AVMetadataObject.ObjectType.ean13:
  88. typeString = "EAN_13"
  89. case AVMetadataObject.ObjectType.itf14:
  90. typeString = "ITF"
  91. case AVMetadataObject.ObjectType.pdf417:
  92. typeString = "PDF_417"
  93. case AVMetadataObject.ObjectType.qr:
  94. typeString = "QR_CODE"
  95. case AVMetadataObject.ObjectType.upce:
  96. typeString = "UPC_E"
  97. default:
  98. return
  99. }
  100. guard let stringValue = code.stringValue else { continue }
  101. let result = ["code": stringValue, "type": typeString]
  102. self?.channel.invokeMethod("onRecognizeQR", arguments: result)
  103. }
  104. }
  105. })
  106. } catch {
  107. let error = FlutterError(code: "unknown-error", message: "Unable to start scanning", details: nil)
  108. result(error)
  109. }
  110. } else {
  111. let error = FlutterError(code: "cameraPermission", message: "Permission denied to access the camera", details: nil)
  112. result(error)
  113. }
  114. })
  115. }
  116. func stopScan(){
  117. if let sc: MTBBarcodeScanner = scanner {
  118. if sc.isScanning() {
  119. sc.stopScanning()
  120. }
  121. }
  122. }
  123. func flipCamera(){
  124. if let sc: MTBBarcodeScanner = scanner {
  125. if sc.hasOppositeCamera() {
  126. sc.flipCamera()
  127. }
  128. }
  129. }
  130. func toggleFlash(){
  131. if let sc: MTBBarcodeScanner = scanner {
  132. if sc.hasTorch() {
  133. sc.toggleTorch()
  134. }
  135. }
  136. }
  137. func pauseCamera() {
  138. if let sc: MTBBarcodeScanner = scanner {
  139. if sc.isScanning() {
  140. sc.freezeCapture()
  141. }
  142. }
  143. }
  144. func resumeCamera() {
  145. if let sc: MTBBarcodeScanner = scanner {
  146. if !sc.isScanning() {
  147. sc.unfreezeCapture()
  148. }
  149. }
  150. }
  151. }