diff --git a/android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt b/android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt index c7355b3..b3d736c 100644 --- a/android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt +++ b/android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt @@ -215,6 +215,8 @@ class QRView(messenger: BinaryMessenger, id: Int, private val params: HashMap?, result: MethodChannel.Result) { val allowedBarcodeTypes = mutableListOf() try { + checkAndRequestPermission(result) + arguments?.forEach { allowedBarcodeTypes.add(BarcodeFormat.values()[it]) } @@ -255,16 +257,22 @@ class QRView(messenger: BinaryMessenger, id: Int, private val params: HashMap= Build.VERSION_CODES.M -> { - Shared.activity?.requestPermissions( - arrayOf(Manifest.permission.CAMERA), - Shared.CAMERA_REQUEST_ID) + if (Shared.activity?.checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { + permissionGranted = true + channel.invokeMethod("onPermissionSet", true) + } else { + Shared.activity?.requestPermissions( + arrayOf(Manifest.permission.CAMERA), + Shared.CAMERA_REQUEST_ID) + } } else -> { result?.error("cameraPermission", "Platform Version to low for camera permission check", null) diff --git a/ios/Classes/QRView.swift b/ios/Classes/QRView.swift index 20cedc8..971be1d 100644 --- a/ios/Classes/QRView.swift +++ b/ios/Classes/QRView.swift @@ -125,7 +125,11 @@ public class QRView:NSObject,FlutterPlatformView { arguments.forEach { arg in allowedBarcodeTypes.append( QRCodeTypes[arg]!) } - MTBBarcodeScanner.requestCameraPermission(success: { permissionGranted in + MTBBarcodeScanner.requestCameraPermission(success: { [weak self] permissionGranted in + guard let self = self else { return } + + self.channel.invokeMethod("onPermissionSet", arguments: permissionGranted) + if permissionGranted { do { try self.scanner?.startScanning(with: self.cameraFacing, resultBlock: { [weak self] codes in @@ -169,8 +173,8 @@ public class QRView:NSObject,FlutterPlatformView { }) } catch { - let error = FlutterError(code: "unknown-error", message: "Unable to start scanning", details: nil) - return result(error) + let scanError = FlutterError(code: "unknown-error", message: "Unable to start scanning", details: error) + result(scanError) } } else { let error = FlutterError(code: "cameraPermission", message: "Permission denied to access the camera", details: nil) diff --git a/lib/src/qr_code_scanner.dart b/lib/src/qr_code_scanner.dart index 03a1a39..80368c0 100644 --- a/lib/src/qr_code_scanner.dart +++ b/lib/src/qr_code_scanner.dart @@ -193,13 +193,9 @@ class QRViewController { break; case 'onPermissionSet': if (call.arguments != null && call.arguments is bool) { - if (call.arguments) { - _hasPermissions = true; - } else { - _hasPermissions = false; - } + _hasPermissions = call.arguments; if (onPermissionSet != null) { - onPermissionSet(this, call.arguments); + onPermissionSet(this, _hasPermissions); } } break;