Переглянути джерело

Merge branch 'master' into camera-facing-not-correct-ios

flutter-beta
Julian Steenbakker 5 роки тому
джерело
коміт
71d5c87fe8
Не вдалося знайти GPG ключ що відповідає даному підпису Ідентифікатор GPG ключа: 16E437C7A3D94250
4 змінених файлів з 96 додано та 71 видалено
  1. +6
    -10
      android/src/main/kotlin/net/touchcapture/qr/flutterqr/FlutterQrPlugin.kt
  2. +67
    -46
      android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt
  3. +4
    -0
      android/src/main/kotlin/net/touchcapture/qr/flutterqr/Shared.kt
  4. +19
    -15
      lib/src/qr_code_scanner.dart

+ 6
- 10
android/src/main/kotlin/net/touchcapture/qr/flutterqr/FlutterQrPlugin.kt Переглянути файл

@@ -21,7 +21,7 @@ class FlutterQrPlugin : FlutterPlugin, ActivityAware {
}

private fun onAttachedToV1(registrar: PluginRegistry.Registrar) {
registrar.addRequestPermissionsResultListener(CameraRequestPermissionsListener())
Shared.registrar = registrar
onAttachedToEngines(registrar.platformViewRegistry(), registrar.messenger(), registrar.activity())
}

@@ -45,27 +45,23 @@ class FlutterQrPlugin : FlutterPlugin, ActivityAware {

override fun onAttachedToActivity(activityPluginBinding: ActivityPluginBinding) {
Shared.activity = activityPluginBinding.activity
activityPluginBinding.addRequestPermissionsResultListener(CameraRequestPermissionsListener())
Shared.binding = activityPluginBinding
}

override fun onDetachedFromActivityForConfigChanges() {
Shared.activity = null
Shared.binding = null
}

override fun onReattachedToActivityForConfigChanges(activityPluginBinding: ActivityPluginBinding) {
Shared.activity = activityPluginBinding.activity
Shared.binding = activityPluginBinding
}

override fun onDetachedFromActivity() {
Shared.activity = null
Shared.binding = null
}
inner class CameraRequestPermissionsListener : PluginRegistry.RequestPermissionsResultListener {
override fun onRequestPermissionsResult(id: Int, permissions: Array<String>, grantResults: IntArray): Boolean {
if (id == Shared.CAMERA_REQUEST_ID && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
return true
}
return false
}
}

}

+ 67
- 46
android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt Переглянути файл

@@ -4,40 +4,50 @@ import android.Manifest
import android.app.Activity
import android.app.Application
import android.content.pm.PackageManager
import android.os.Bundle
import android.view.View
import com.google.zxing.ResultPoint
import android.hardware.Camera.CameraInfo
import android.os.Build
import android.os.Bundle
import android.view.View
import com.google.zxing.BarcodeFormat
import com.google.zxing.ResultPoint
import com.journeyapps.barcodescanner.BarcodeCallback
import com.journeyapps.barcodescanner.BarcodeResult
import com.journeyapps.barcodescanner.BarcodeView
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.platform.PlatformView


class QRView(messenger: BinaryMessenger, id: Int, private val params: HashMap<String, Any>) :
PlatformView, MethodChannel.MethodCallHandler {
PlatformView, MethodChannel.MethodCallHandler, PluginRegistry.RequestPermissionsResultListener {

private var isTorchOn: Boolean = false
private var isPaused: Boolean = false
private var barcodeView: BarcodeView? = null
private val channel: MethodChannel
private val channel: MethodChannel = MethodChannel(messenger, "net.touchcapture.qr.flutterqr/qrview_$id")
private var permissionGranted: Boolean = false

init {
checkAndRequestPermission(null)
channel = MethodChannel(messenger, "net.touchcapture.qr.flutterqr/qrview_$id")
if (Shared.binding != null) {
Shared.binding!!.addRequestPermissionsResultListener(this)
}

if (Shared.registrar != null) {
Shared.registrar!!.addRequestPermissionsResultListener(this)
}

channel.setMethodCallHandler(this)
Shared.activity?.application?.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
override fun onActivityPaused(p0: Activity) {
if (p0 == Shared.activity && !isPaused) {
if (p0 == Shared.activity && !isPaused && hasCameraPermission()) {
barcodeView?.pause()
}
}

override fun onActivityResumed(p0: Activity) {
if (p0 == Shared.activity && !isPaused) {
if (p0 == Shared.activity && !isPaused && hasCameraPermission()) {
barcodeView?.resume()
}
}
@@ -93,20 +103,22 @@ class QRView(messenger: BinaryMessenger, id: Int, private val params: HashMap<St
if (barcodeView == null) {
return barCodeViewNotSet(result)
} else if (!hasCameraPermission()) {
return cameraPermissionNotSet(result)
}
checkAndRequestPermission(result)
} else {
barcodeView!!.pause()
val settings = barcodeView!!.cameraSettings

if(settings.requestedCameraId == CameraInfo.CAMERA_FACING_FRONT)
settings.requestedCameraId = CameraInfo.CAMERA_FACING_BACK
else
settings.requestedCameraId = CameraInfo.CAMERA_FACING_FRONT

barcodeView!!.pause()
val settings = barcodeView!!.cameraSettings
barcodeView!!.cameraSettings = settings
barcodeView!!.resume()
result.success(settings.requestedCameraId)
}

if(settings.requestedCameraId == CameraInfo.CAMERA_FACING_FRONT)
settings.requestedCameraId = CameraInfo.CAMERA_FACING_BACK
else
settings.requestedCameraId = CameraInfo.CAMERA_FACING_FRONT

barcodeView!!.cameraSettings = settings
barcodeView!!.resume()
result.success(settings.requestedCameraId)
}

private fun getFlashInfo(result: MethodChannel.Result) {
@@ -119,8 +131,6 @@ class QRView(messenger: BinaryMessenger, id: Int, private val params: HashMap<St
private fun toggleFlash(result: MethodChannel.Result) {
if (barcodeView == null) {
return barCodeViewNotSet(result)
} else if (!hasCameraPermission()) {
return cameraPermissionNotSet(result)
}

if (hasFlash()) {
@@ -137,28 +147,28 @@ class QRView(messenger: BinaryMessenger, id: Int, private val params: HashMap<St
if (barcodeView == null) {
return barCodeViewNotSet(result)
} else if (!hasCameraPermission()) {
return cameraPermissionNotSet(result)
}

if (barcodeView!!.isPreviewActive) {
isPaused = true
barcodeView!!.pause()
checkAndRequestPermission(result)
} else {
if (barcodeView!!.isPreviewActive) {
isPaused = true
barcodeView!!.pause()
}
result.success(true)
}
result.success(true)
}

private fun resumeCamera(result: MethodChannel.Result) {
if (barcodeView == null) {
return barCodeViewNotSet(result)
} else if (!hasCameraPermission()) {
return cameraPermissionNotSet(result)
}

if (!barcodeView!!.isPreviewActive) {
isPaused = false
barcodeView!!.resume()
checkAndRequestPermission(result)
} else {
if (!barcodeView!!.isPreviewActive) {
isPaused = false
barcodeView!!.resume()
}
result.success(true)
}
result.success(true)
}

private fun hasFlash(): Boolean {
@@ -182,10 +192,6 @@ class QRView(messenger: BinaryMessenger, id: Int, private val params: HashMap<St
result.error("404", "No barcode view found", null)
}

private fun cameraPermissionNotSet(result: MethodChannel.Result) {
result.error("cameraPermission", " Permission denied to access the camera", null)
}

override fun getView(): View {
return initBarCodeView().apply {}!!
}
@@ -196,16 +202,17 @@ class QRView(messenger: BinaryMessenger, id: Int, private val params: HashMap<St
if (params["cameraFacing"] as Int == 1) {
barcodeView?.cameraSettings?.requestedCameraId = CameraInfo.CAMERA_FACING_FRONT
}
barcodeView!!.resume()
} else {
if (hasCameraPermission()) {
if (!isPaused) barcodeView!!.resume()
} else {
checkAndRequestPermission(null)
}
}
return barcodeView
}

private fun startScan(arguments: List<Int>?, result: MethodChannel.Result) {
if (!hasCameraPermission()) {
return cameraPermissionNotSet(result)
}

val allowedBarcodeTypes = mutableListOf<BarcodeFormat>()
try {
arguments?.forEach {
@@ -254,7 +261,6 @@ class QRView(messenger: BinaryMessenger, id: Int, private val params: HashMap<St

private fun checkAndRequestPermission(result: MethodChannel.Result?) {
when {
hasCameraPermission() -> result?.success(true)
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> {
Shared.activity?.requestPermissions(
arrayOf(Manifest.permission.CAMERA),
@@ -265,5 +271,20 @@ class QRView(messenger: BinaryMessenger, id: Int, private val params: HashMap<St
}
}
}

override fun onRequestPermissionsResult( requestCode: Int,
permissions: Array<out String>?,
grantResults: IntArray): Boolean {

if (requestCode == Shared.CAMERA_REQUEST_ID && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
permissionGranted = true
channel.invokeMethod("onPermissionSet", true)
return true
}
permissionGranted = false
channel.invokeMethod("onPermissionSet", false)
return false
}

}


+ 4
- 0
android/src/main/kotlin/net/touchcapture/qr/flutterqr/Shared.kt Переглянути файл

@@ -1,8 +1,12 @@
package net.touchcapture.qr.flutterqr

import android.app.Activity
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.PluginRegistry

object Shared {
const val CAMERA_REQUEST_ID = 513469796
var activity: Activity? = null
var binding: ActivityPluginBinding? = null
var registrar: PluginRegistry.Registrar? = null
}

+ 19
- 15
lib/src/qr_code_scanner.dart Переглянути файл

@@ -64,12 +64,12 @@ class _QRViewState extends State<QRView> {
super.initState();
WidgetsBinding.instance.addObserver(LifecycleEventHandler(
resumeCallBack: () async => {
if (_channel != null) {
QRViewController.updateDimensions(
widget.key, _channel,
overlay: widget.overlay)
}
}));
if (_channel != null)
{
QRViewController.updateDimensions(widget.key, _channel,
overlay: widget.overlay)
}
}));
}

@override
@@ -86,9 +86,9 @@ class _QRViewState extends State<QRView> {

bool onNotification(notification) {
Future.microtask(() => {
QRViewController.updateDimensions(widget.key, _channel,
overlay: widget.overlay)
});
QRViewController.updateDimensions(widget.key, _channel,
overlay: widget.overlay)
});

return false;
}
@@ -139,9 +139,9 @@ class _QRViewState extends State<QRView> {
_channel = MethodChannel('net.touchcapture.qr.flutterqr/qrview_$id');

// Start scan after creation of the view
final controller =
QRViewController._(_channel, widget.key, widget.onPermissionSet)
.._startScan(widget.key, widget.overlay, widget.formatsAllowed);
final controller = QRViewController._(
_channel, widget.key, widget.onPermissionSet, widget.cameraFacing)
.._startScan(widget.key, widget.overlay, widget.formatsAllowed);

// Initialize the controller for controlling the QRView
if (widget.onQRViewCreated != null) {
@@ -166,8 +166,9 @@ class _QrCameraSettings {

class QRViewController {
QRViewController._(MethodChannel channel, GlobalKey qrKey,
PermissionSetCallback onPermissionSet)
: _channel = channel {
PermissionSetCallback onPermissionSet, CameraFacing cameraFacing)
: _channel = channel,
_cameraFacing = cameraFacing {
_channel.setMethodCallHandler((call) async {
switch (call.method) {
case 'onRecognizeQR':
@@ -204,6 +205,7 @@ class QRViewController {
}

final MethodChannel _channel;
final CameraFacing _cameraFacing;
final StreamController<Barcode> _scanUpdateController =
StreamController<Barcode>();

@@ -232,6 +234,8 @@ class QRViewController {
/// Gets information about which camera is active.
Future<CameraFacing> getCameraInfo() async {
try {
var cameraFacing = await _channel.invokeMethod('getCameraInfo') as int;
if (cameraFacing == -1) return _cameraFacing;
return CameraFacing
.values[await _channel.invokeMethod('getCameraInfo') as int];
} on PlatformException catch (e) {
@@ -320,7 +324,7 @@ class QRViewController {
await Future.delayed(Duration(milliseconds: 300));
}
final RenderBox renderBox = key.currentContext.findRenderObject();
try {
try {
await channel.invokeMethod('setDimensions', {
'width': renderBox.size.width,
'height': renderBox.size.height,


Завантаження…
Відмінити
Зберегти