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

Merge pull request #188 from juliuscanute/185-permission-on-app-start

185 permission on app start
flutter-beta
Julian Steenbakker 5 роки тому
committed by GitHub
джерело
коміт
862a966c57
Не вдалося знайти GPG ключ що відповідає даному підпису Ідентифікатор GPG ключа: 4AEE18F83AFDEB23
3 змінених файлів з 66 додано та 86 видалено
  1. +1
    -61
      android/src/main/kotlin/net/touchcapture/qr/flutterqr/FlutterQrPlugin.kt
  2. +63
    -23
      android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt
  3. +2
    -2
      android/src/main/kotlin/net/touchcapture/qr/flutterqr/Shared.kt

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

@@ -1,25 +1,15 @@
package net.touchcapture.qr.flutterqr

import android.Manifest
import android.app.Activity
import android.content.pm.PackageManager
import android.os.Build
import androidx.annotation.NonNull
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.platform.PlatformViewRegistry


class FlutterQrPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {

var cameraPermissionContinuation: Runnable? = null
var requestingPermission = false
class FlutterQrPlugin : FlutterPlugin, ActivityAware {

/** Plugin registration embedding v1 */
companion object {
@@ -31,7 +21,6 @@ class FlutterQrPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {

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

@@ -53,16 +42,9 @@ class FlutterQrPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {
"net.touchcapture.qr.flutterqr/qrview", QRViewFactory(messenger))
}

override fun onMethodCall(call: MethodCall, result: Result) {
when (call.method) {
"checkAndRequestPermission" -> checkAndRequestPermission(result)
}
}

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

override fun onDetachedFromActivityForConfigChanges() {
@@ -76,46 +58,4 @@ class FlutterQrPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {
override fun onDetachedFromActivity() {
Shared.activity = null
}

private inner class CameraRequestPermissionsListener : PluginRegistry.RequestPermissionsResultListener {
override fun onRequestPermissionsResult(id: Int, permissions: Array<String>, grantResults: IntArray): Boolean {
if (id == QRView.CAMERA_REQUEST_ID && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
cameraPermissionContinuation?.run()
return true
}
return false
}
}

private fun hasCameraPermission(): Boolean {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||
Shared.activity?.checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
}

private fun checkAndRequestPermission(result: Result?) {
if (cameraPermissionContinuation != null) {
result?.error("cameraPermission", "Camera permission request ongoing", null)
}

cameraPermissionContinuation = Runnable {
cameraPermissionContinuation = null
if (!hasCameraPermission()) {
result?.error(
"cameraPermission", "MediaRecorderCamera permission not granted", null)
return@Runnable
}
}

requestingPermission = false
if (hasCameraPermission()) {
cameraPermissionContinuation?.run()
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestingPermission = true
Shared.activity?.requestPermissions(
arrayOf(Manifest.permission.CAMERA),
QRView.CAMERA_REQUEST_ID)
}
}
}
}

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

@@ -1,5 +1,6 @@
package net.touchcapture.qr.flutterqr

import android.Manifest
import android.app.Activity
import android.app.Application
import android.content.Context
@@ -8,26 +9,25 @@ import android.os.Bundle
import android.view.View
import com.google.zxing.ResultPoint
import android.hardware.Camera.CameraInfo
import android.os.Build
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 context: Context) :
PlatformView, MethodChannel.MethodCallHandler {

companion object {
const val CAMERA_REQUEST_ID = 513469796
}

var barcodeView: BarcodeView? = null

private var isTorchOn: Boolean = false
val channel: MethodChannel
private var barcodeView: BarcodeView? = null
private var requestingPermission = false
private val channel: MethodChannel

init {
checkAndRequestPermission(null)
channel = MethodChannel(messenger, "net.touchcapture.qr.flutterqr/qrview_$id")
channel.setMethodCallHandler(this)
Shared.activity?.application?.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
@@ -60,6 +60,28 @@ class QRView(messenger: BinaryMessenger, id: Int, private val context: Context)
})
}

override fun dispose() {
barcodeView?.pause()
barcodeView = null
}

override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
when(call.method){
"flipCamera" -> {
flipCamera()
}
"toggleFlash" -> {
toggleFlash()
}
"pauseCamera" -> {
pauseCamera()
}
"resumeCamera" -> {
resumeCamera()
}
}
}

fun flipCamera() {
barcodeView?.pause()
var settings = barcodeView?.cameraSettings
@@ -126,28 +148,46 @@ class QRView(messenger: BinaryMessenger, id: Int, private val context: Context)
return barcode
}

override fun dispose() {
barcodeView?.pause()
barcodeView = null
private fun hasCameraPermission(): Boolean {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||
Shared.activity?.checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
}

override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
when(call.method){
"flipCamera" -> {
flipCamera()
}
"toggleFlash" -> {
toggleFlash()
}
"pauseCamera" -> {
pauseCamera()
private fun checkAndRequestPermission(result: MethodChannel.Result?) {
if (Shared.cameraPermissionContinuation != null) {
result?.error("cameraPermission", "Camera permission request ongoing", null)
}

Shared.cameraPermissionContinuation = Runnable {
Shared.cameraPermissionContinuation = null
if (!hasCameraPermission()) {
result?.error(
"cameraPermission", "MediaRecorderCamera permission not granted", null)
return@Runnable
}
"resumeCamera" -> {
resumeCamera()
}

requestingPermission = false
if (hasCameraPermission()) {
Shared.cameraPermissionContinuation?.run()
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestingPermission = true
Shared.activity?.requestPermissions(
arrayOf(Manifest.permission.CAMERA),
Shared.CAMERA_REQUEST_ID)
}
}
}

}


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) {
Shared.cameraPermissionContinuation?.run()
return true
}
return false
}
}

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

@@ -1,9 +1,9 @@
package net.touchcapture.qr.flutterqr

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


object Shared {
const val CAMERA_REQUEST_ID = 513469796
var activity: Activity? = null
var cameraPermissionContinuation: Runnable? = null
}

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