The QR Code Scanner package for Appeto SDK.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

166 Zeilen
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. }