The QR Code Scanner package for Appeto SDK.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 
 

298 行
13 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. var QRCodeTypes = [
  16. 0: AVMetadataObject.ObjectType.aztec,
  17. 2: AVMetadataObject.ObjectType.code39,
  18. 3: AVMetadataObject.ObjectType.code93,
  19. 4: AVMetadataObject.ObjectType.code128,
  20. 5: AVMetadataObject.ObjectType.dataMatrix,
  21. 6: AVMetadataObject.ObjectType.ean8,
  22. 7: AVMetadataObject.ObjectType.ean13,
  23. 8: AVMetadataObject.ObjectType.interleaved2of5,
  24. 10: AVMetadataObject.ObjectType.pdf417,
  25. 11: AVMetadataObject.ObjectType.qr,
  26. 15: AVMetadataObject.ObjectType.upce
  27. ]
  28. public init(withFrame frame: CGRect, withRegistrar registrar: FlutterPluginRegistrar, withId id: Int64, params: Dictionary<String, Any>){
  29. self.registrar = registrar
  30. previewView = UIView(frame: frame)
  31. cameraFacing = MTBCamera.init(rawValue: UInt(Int(params["cameraFacing"] as! Double))) ?? MTBCamera.back
  32. channel = FlutterMethodChannel(name: "net.touchcapture.qr.flutterqr/qrview_\(id)", binaryMessenger: registrar.messenger())
  33. }
  34. deinit {
  35. scanner?.stopScanning()
  36. }
  37. public func view() -> UIView {
  38. channel.setMethodCallHandler({
  39. [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
  40. switch(call.method){
  41. case "setDimensions":
  42. let arguments = call.arguments as! Dictionary<String, Double>
  43. self?.setDimensions(result, width: arguments["width"] ?? 0, height: arguments["height"] ?? 0, scanArea: arguments["scanArea"] ?? 0)
  44. case "startScan":
  45. self?.startScan(call.arguments as! Array<Int>, result)
  46. case "flipCamera":
  47. self?.flipCamera(result)
  48. case "toggleFlash":
  49. self?.toggleFlash(result)
  50. case "pauseCamera":
  51. self?.pauseCamera(result)
  52. case "resumeCamera":
  53. self?.resumeCamera(result)
  54. case "getCameraInfo":
  55. self?.getCameraInfo(result)
  56. case "getFlashInfo":
  57. self?.getFlashInfo(result)
  58. case "getSystemFeatures":
  59. self?.getSystemFeatures(result)
  60. default:
  61. result(FlutterMethodNotImplemented)
  62. return
  63. }
  64. })
  65. return previewView
  66. }
  67. func setDimensions(_ result: @escaping FlutterResult, width: Double, height: Double, scanArea: Double) -> Void {
  68. MTBBarcodeScanner.requestCameraPermission(success: { permissionGranted in
  69. if permissionGranted {
  70. // First set the size of the preview area.
  71. self.previewView.frame = CGRect(x: 0, y: 0, width: width, height: height)
  72. // Then set the size of the scan area.
  73. let midX = self.view().bounds.midX
  74. let midY = self.view().bounds.midY
  75. // Check if the scanner is already created.
  76. if let sc: MTBBarcodeScanner = self.scanner {
  77. if let previewLayer = sc.previewLayer {
  78. previewLayer.frame = self.previewView.bounds;
  79. }
  80. if (scanArea != 0) {
  81. sc.scanRect = CGRect(x: Double(midX) - (scanArea / 2), y: Double(midY) - (scanArea / 2), width: scanArea, height: scanArea)
  82. }
  83. } else {
  84. // Create a scanner view if it doesn't exist yet.
  85. self.scanner = MTBBarcodeScanner(previewView: self.previewView)
  86. if (scanArea != 0) {
  87. self.scanner?.didStartScanningBlock = {
  88. self.scanner?.scanRect = CGRect(x: Double(midX) - (scanArea / 2), y: Double(midY) - (scanArea / 2), width: scanArea, height: scanArea)
  89. }
  90. }
  91. }
  92. return result(width)
  93. } else {
  94. return result(FlutterError(code: "cameraPermission", message: "Permission denied to access the camera", details: nil))
  95. }
  96. })
  97. }
  98. func startScan(_ arguments: Array<Int>, _ result: @escaping FlutterResult) -> Void {
  99. if (scanner == nil) {
  100. scanner = MTBBarcodeScanner(previewView: previewView)
  101. }
  102. var allowedBarcodeTypes: Array<AVMetadataObject.ObjectType> = []
  103. arguments.forEach { arg in
  104. allowedBarcodeTypes.append( QRCodeTypes[arg]!)
  105. }
  106. MTBBarcodeScanner.requestCameraPermission(success: { permissionGranted in
  107. if permissionGranted {
  108. do {
  109. try self.scanner?.startScanning(with: self.cameraFacing, resultBlock: { [weak self] codes in
  110. if let codes = codes {
  111. for code in codes {
  112. var typeString: String;
  113. switch(code.type) {
  114. case AVMetadataObject.ObjectType.aztec:
  115. typeString = "AZTEC"
  116. case AVMetadataObject.ObjectType.code39:
  117. typeString = "CODE_39"
  118. case AVMetadataObject.ObjectType.code93:
  119. typeString = "CODE_93"
  120. case AVMetadataObject.ObjectType.code128:
  121. typeString = "CODE_128"
  122. case AVMetadataObject.ObjectType.dataMatrix:
  123. typeString = "DATA_MATRIX"
  124. case AVMetadataObject.ObjectType.ean8:
  125. typeString = "EAN_8"
  126. case AVMetadataObject.ObjectType.ean13:
  127. typeString = "EAN_13"
  128. case AVMetadataObject.ObjectType.itf14:
  129. typeString = "ITF"
  130. case AVMetadataObject.ObjectType.pdf417:
  131. typeString = "PDF_417"
  132. case AVMetadataObject.ObjectType.qr:
  133. typeString = "QR_CODE"
  134. case AVMetadataObject.ObjectType.upce:
  135. typeString = "UPC_E"
  136. default:
  137. return
  138. }
  139. guard let stringValue = code.stringValue else { continue }
  140. let result = ["code": stringValue, "type": typeString]
  141. if allowedBarcodeTypes.count == 0 || allowedBarcodeTypes.contains(code.type) {
  142. self?.channel.invokeMethod("onRecognizeQR", arguments: result)
  143. }
  144. }
  145. }
  146. })
  147. } catch {
  148. let error = FlutterError(code: "unknown-error", message: "Unable to start scanning", details: nil)
  149. return result(error)
  150. }
  151. } else {
  152. return result(FlutterError(code: "cameraPermission", message: "Permission denied to access the camera", details: nil))
  153. }
  154. })
  155. }
  156. func stopScan(_ result: @escaping FlutterResult){
  157. MTBBarcodeScanner.requestCameraPermission(success: { permissionGranted in
  158. if permissionGranted {
  159. if let sc: MTBBarcodeScanner = self.scanner {
  160. if sc.isScanning() {
  161. sc.stopScanning()
  162. }
  163. }
  164. } else {
  165. return result(FlutterError(code: "cameraPermission", message: "Permission denied to access the camera", details: nil))
  166. }
  167. })
  168. }
  169. func getCameraInfo(_ result: @escaping FlutterResult) -> Void {
  170. if let sc: MTBBarcodeScanner = scanner {
  171. result(sc.camera.rawValue)
  172. } else {
  173. let error = FlutterError(code: "cameraInformationError", message: "Could not get camera information", details: nil)
  174. result(error)
  175. }
  176. }
  177. func flipCamera(_ result: @escaping FlutterResult){
  178. MTBBarcodeScanner.requestCameraPermission(success: { permissionGranted in
  179. if permissionGranted {
  180. if let sc: MTBBarcodeScanner = self.scanner {
  181. if sc.hasOppositeCamera() {
  182. sc.flipCamera()
  183. }
  184. return result(sc.camera.rawValue)
  185. }
  186. return result(FlutterError(code: "404", message: "No barcode scanner found", details: nil))
  187. } else {
  188. return result(FlutterError(code: "cameraPermission", message: "Permission denied to access the camera", details: nil))
  189. }
  190. })
  191. }
  192. func getFlashInfo(_ result: @escaping FlutterResult) -> Void {
  193. if let sc: MTBBarcodeScanner = scanner {
  194. result(sc.torchMode.rawValue != 0)
  195. } else {
  196. let error = FlutterError(code: "cameraInformationError", message: "Could not get flash information", details: nil)
  197. result(error)
  198. }
  199. }
  200. func toggleFlash(_ result: @escaping FlutterResult){
  201. MTBBarcodeScanner.requestCameraPermission(success: { permissionGranted in
  202. if permissionGranted {
  203. if let sc: MTBBarcodeScanner = self.scanner {
  204. if sc.hasTorch() {
  205. sc.toggleTorch()
  206. return result(sc.torchMode == MTBTorchMode(rawValue: 1))
  207. }
  208. return result(FlutterError(code: "404", message: "This device doesn\'t support flash", details: nil))
  209. }
  210. return result(FlutterError(code: "404", message: "No barcode scanner found", details: nil))
  211. } else {
  212. return result(FlutterError(code: "cameraPermission", message: "Permission denied to access the camera", details: nil))
  213. }
  214. })
  215. }
  216. func pauseCamera(_ result: @escaping FlutterResult) {
  217. MTBBarcodeScanner.requestCameraPermission(success: { permissionGranted in
  218. if permissionGranted {
  219. if let sc: MTBBarcodeScanner = self.scanner {
  220. if sc.isScanning() {
  221. sc.freezeCapture()
  222. }
  223. return result(true)
  224. }
  225. return result(FlutterError(code: "404", message: "No barcode scanner found", details: nil))
  226. } else {
  227. return result(FlutterError(code: "cameraPermission", message: "Permission denied to access the camera", details: nil))
  228. }
  229. })
  230. }
  231. func resumeCamera(_ result: @escaping FlutterResult) {
  232. MTBBarcodeScanner.requestCameraPermission(success: { permissionGranted in
  233. if permissionGranted {
  234. if let sc: MTBBarcodeScanner = self.scanner {
  235. if !sc.isScanning() {
  236. sc.unfreezeCapture()
  237. }
  238. return result(true)
  239. }
  240. return result(FlutterError(code: "404", message: "No barcode scanner found", details: nil))
  241. } else {
  242. return result(FlutterError(code: "cameraPermission", message: "Permission denied to access the camera", details: nil))
  243. }
  244. })
  245. }
  246. func getSystemFeatures(_ result: @escaping FlutterResult) -> Void {
  247. if let sc: MTBBarcodeScanner = scanner {
  248. var hasBackCameraVar = false
  249. var hasFrontCameraVar = false
  250. let camera = sc.camera
  251. if(camera == MTBCamera(rawValue: 0)){
  252. hasBackCameraVar = true
  253. if sc.hasOppositeCamera() {
  254. hasFrontCameraVar = true
  255. }
  256. }else{
  257. hasFrontCameraVar = true
  258. if sc.hasOppositeCamera() {
  259. hasBackCameraVar = true
  260. }
  261. }
  262. return result([
  263. "hasFrontCamera": hasFrontCameraVar,
  264. "hasBackCamera": hasBackCameraVar,
  265. "hasFlash": sc.hasTorch(),
  266. "activeCamera": camera.rawValue
  267. ])
  268. }
  269. return result(FlutterError(code: "404", message: nil, details: nil))
  270. }
  271. }