Commit d6f17852 authored by wanglei's avatar wanglei

Merge remote-tracking branch 'origin/master'

parents 454a2467 f382978c
...@@ -2,16 +2,20 @@ package com.base.browserwhite.ui.activity ...@@ -2,16 +2,20 @@ package com.base.browserwhite.ui.activity
import android.app.usage.StorageStatsManager import android.app.usage.StorageStatsManager
import android.graphics.Color import android.graphics.Color
import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Environment import android.os.Environment
import android.os.StatFs import android.os.StatFs
import android.os.storage.StorageManager import android.os.storage.StorageManager
import android.provider.MediaStore
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.base.browserwhite.databinding.ActivityMainBinding import com.base.browserwhite.databinding.ActivityMainBinding
import com.base.browserwhite.ui.activity.scanqrc.QRImageAnalyzer
import com.base.browserwhite.ui.activity.scanqrc.ScanQRCActivity
import com.base.browserwhite.ui.fragment.FileFragment import com.base.browserwhite.ui.fragment.FileFragment
import com.base.browserwhite.ui.fragment.HomeFragment import com.base.browserwhite.ui.fragment.HomeFragment
import com.base.browserwhite.ui.views.DialogViews.showMyAccountDialog import com.base.browserwhite.ui.views.DialogViews.showMyAccountDialog
...@@ -39,7 +43,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>() { ...@@ -39,7 +43,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
mutableListOf(homeFragment, fileFragment) mutableListOf(homeFragment, fileFragment)
} }
override fun initView() { override fun initView() {
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
...@@ -63,6 +66,13 @@ class MainActivity : BaseActivity<ActivityMainBinding>() { ...@@ -63,6 +66,13 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
override fun onPageSelected(position: Int) { override fun onPageSelected(position: Int) {
} }
}) })
val qq = QRImageAnalyzer()
qq.action = { qrCodeValue ->
}
val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, Uri.EMPTY)
qq.processImage(this, bitmap)
} }
......
package com.base.browserwhite.ui.activity.scanqrc
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageProxy
import com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity
import com.base.browserwhite.ui.fragment.HomeFragment.Companion.isMatchesUrl
import com.base.browserwhite.utils.LogEx
import com.google.mlkit.vision.barcode.BarcodeScannerOptions
import com.google.mlkit.vision.barcode.BarcodeScanning
import com.google.mlkit.vision.barcode.common.Barcode
import com.google.mlkit.vision.barcode.common.Barcode.FORMAT_AZTEC
import com.google.mlkit.vision.barcode.common.Barcode.FORMAT_CODABAR
import com.google.mlkit.vision.common.InputImage
//图形分析器
class QRImageAnalyzer() : ImageAnalysis.Analyzer {
private val TAG = "QRImageAnalyzer"
var action: ((qrCodeValue: String) -> Unit)? = null
//如需仅检测 Aztec 码和 QR 码
private val options = BarcodeScannerOptions.Builder().setBarcodeFormats(
Barcode.FORMAT_QR_CODE, Barcode.FORMAT_AZTEC
).build()
//获取解析器
private val detector = BarcodeScanning.getClient(options)
@SuppressLint("UnsafeOptInUsageError")
override fun analyze(imageProxy: ImageProxy) {
val mediaImage = imageProxy.image
if (mediaImage != null) {
val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
detector.process(image).addOnSuccessListener { barcodeList ->
// barcodeList.forEach {
// LogEx.logDebug(TAG, "rawValue=${it.rawValue}")
// }
handleBarcodeList(barcodeList)
}.addOnFailureListener {
LogEx.logDebug(TAG, "OnFailure")
}.addOnCompleteListener {
LogEx.logDebug(TAG, "OnComplete")
imageProxy.close()
}
} else {
imageProxy.close()
}
}
private fun handleBarcodeList(barcodeList: List<Barcode>) {
if (barcodeList.size == 1) {
val barcode = barcodeList[0]
val valueType = barcode.valueType
LogEx.logDebug(TAG, "valueType=$valueType")
when (valueType) {
Barcode.FORMAT_QR_CODE, FORMAT_CODABAR, FORMAT_AZTEC -> {
val qrCodeValue = barcode.rawValue ?: ""
LogEx.logDebug(TAG, "qrCodeValue=${qrCodeValue}")
if (isMatchesUrl(qrCodeValue) or qrCodeValue.startsWith("http") or qrCodeValue.startsWith("https")) {
action?.invoke(qrCodeValue)
}
}
}
}
}
fun processImage(context: Context, bitmap: Bitmap) {
val image = InputImage.fromBitmap(bitmap, 0)
val barcodeScanner = BarcodeScanning.getClient(options)
barcodeScanner.process(image)
.addOnSuccessListener { barcodes ->
handleBarcodeList(barcodes)
}
.addOnFailureListener { exception ->
// 处理失败情况
}
}
}
\ No newline at end of file
package com.base.browserwhite.ui.activity.scanqrc package com.base.browserwhite.ui.activity.scanqrc
import android.Manifest import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.Color import android.graphics.Color
import android.hardware.camera2.CameraAccessException import android.hardware.camera2.CameraAccessException
import android.hardware.camera2.CameraCharacteristics import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraManager import android.hardware.camera2.CameraManager
import android.util.Log
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.camera.core.AspectRatio import androidx.camera.core.AspectRatio
import androidx.camera.core.Camera import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector import androidx.camera.core.CameraSelector
import androidx.camera.core.ImageAnalysis import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageProxy
import androidx.camera.core.Preview import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
...@@ -23,17 +20,10 @@ import androidx.core.view.updatePadding ...@@ -23,17 +20,10 @@ import androidx.core.view.updatePadding
import com.base.browserwhite.databinding.ActivityScanQrcBinding import com.base.browserwhite.databinding.ActivityScanQrcBinding
import com.base.browserwhite.ui.activity.BaseActivity import com.base.browserwhite.ui.activity.BaseActivity
import com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity import com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity
import com.base.browserwhite.ui.fragment.HomeFragment.Companion.isMatchesUrl
import com.base.browserwhite.ui.views.DialogViews.showGerPermission import com.base.browserwhite.ui.views.DialogViews.showGerPermission
import com.base.browserwhite.utils.BarUtils import com.base.browserwhite.utils.BarUtils
import com.base.browserwhite.utils.LogEx import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.PermissionHelp.checkCameraPermission import com.base.browserwhite.utils.PermissionHelp.checkCameraPermission
import com.google.mlkit.vision.barcode.BarcodeScannerOptions
import com.google.mlkit.vision.barcode.BarcodeScanning
import com.google.mlkit.vision.barcode.common.Barcode
import com.google.mlkit.vision.barcode.common.Barcode.FORMAT_AZTEC
import com.google.mlkit.vision.barcode.common.Barcode.FORMAT_CODABAR
import com.google.mlkit.vision.common.InputImage
import java.util.concurrent.ExecutorService import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors import java.util.concurrent.Executors
import kotlin.math.abs import kotlin.math.abs
...@@ -57,6 +47,7 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() { ...@@ -57,6 +47,7 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
private var cameraProvider: ProcessCameraProvider? = null private var cameraProvider: ProcessCameraProvider? = null
private lateinit var cameraExecutor: ExecutorService private lateinit var cameraExecutor: ExecutorService
private var imageAnalyzer: ImageAnalysis? = null private var imageAnalyzer: ImageAnalysis? = null
private lateinit var qrImageAnalyzer: QRImageAnalyzer
override fun initView() { override fun initView() {
...@@ -146,10 +137,19 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() { ...@@ -146,10 +137,19 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
//构建图片捕捉类 //构建图片捕捉类
// imageCapture = buildImageCapture(aspectRation, rotation) // imageCapture = buildImageCapture(aspectRation, rotation)
qrImageAnalyzer = QRImageAnalyzer()
qrImageAnalyzer.action = { qrCodeValue ->
binding.root.post {
startActivity(Intent(this@ScanQRCActivity, WebBrowserActivity::class.java).apply {
putExtra("url", qrCodeValue)
})
finish()
}
}
//构建图片分析器 //构建图片分析器
imageAnalyzer = buildImageAnalysis(aspectRation, rotation) { imageAnalyzer = buildImageAnalysis(aspectRation, rotation) {
it.setAnalyzer(cameraExecutor, QRImageAnalyzer()) it.setAnalyzer(cameraExecutor, qrImageAnalyzer)
} }
//每次绑定需先解绑 //每次绑定需先解绑
...@@ -244,59 +244,5 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() { ...@@ -244,59 +244,5 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
return cameraId ?: "" return cameraId ?: ""
} }
//图形分析器
inner class QRImageAnalyzer : ImageAnalysis.Analyzer {
//如需仅检测 Aztec 码和 QR 码
private val options = BarcodeScannerOptions.Builder().setBarcodeFormats(
Barcode.FORMAT_QR_CODE, Barcode.FORMAT_AZTEC
).build()
//获取解析器
private val detector = BarcodeScanning.getClient(options)
@SuppressLint("UnsafeOptInUsageError")
override fun analyze(imageProxy: ImageProxy) {
val mediaImage = imageProxy.image
if (mediaImage != null) {
val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
detector.process(image).addOnSuccessListener { barcodeList ->
// barcodeList.forEach {
// LogEx.logDebug(TAG, "rawValue=${it.rawValue}")
// }
if (barcodeList.size == 1) {
val barcode = barcodeList[0]
val valueType = barcode.valueType
LogEx.logDebug(TAG, "valueType=$valueType")
when (valueType) {
Barcode.FORMAT_QR_CODE, FORMAT_CODABAR, FORMAT_AZTEC -> {
val qrCodeValue = barcode.rawValue ?: ""
LogEx.logDebug(TAG, "qrCodeValue=${qrCodeValue}")
if (isMatchesUrl(qrCodeValue) or qrCodeValue.startsWith("http") or qrCodeValue.startsWith("https")) {
binding.root.post {
startActivity(Intent(this@ScanQRCActivity, WebBrowserActivity::class.java).apply {
putExtra("url", qrCodeValue)
})
finish()
}
}
}
}
// imageAnalysis.clearAnalyzer()
}
}.addOnFailureListener {
LogEx.logDebug(TAG, "OnFailure")
}.addOnCompleteListener {
LogEx.logDebug(TAG, "OnComplete")
imageProxy.close()
}
} else {
imageProxy.close()
}
}
}
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment