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
import android.app.usage.StorageStatsManager
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.os.StatFs
import android.os.storage.StorageManager
import android.provider.MediaStore
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
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.HomeFragment
import com.base.browserwhite.ui.views.DialogViews.showMyAccountDialog
......@@ -39,7 +43,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
mutableListOf(homeFragment, fileFragment)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
......@@ -63,6 +66,13 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
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
import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Color
import android.hardware.camera2.CameraAccessException
import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraManager
import android.util.Log
import androidx.activity.addCallback
import androidx.camera.core.AspectRatio
import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageProxy
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.core.content.ContextCompat
......@@ -23,17 +20,10 @@ import androidx.core.view.updatePadding
import com.base.browserwhite.databinding.ActivityScanQrcBinding
import com.base.browserwhite.ui.activity.BaseActivity
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.utils.BarUtils
import com.base.browserwhite.utils.LogEx
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.Executors
import kotlin.math.abs
......@@ -57,6 +47,7 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
private var cameraProvider: ProcessCameraProvider? = null
private lateinit var cameraExecutor: ExecutorService
private var imageAnalyzer: ImageAnalysis? = null
private lateinit var qrImageAnalyzer: QRImageAnalyzer
override fun initView() {
......@@ -146,10 +137,19 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
//构建图片捕捉类
// 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) {
it.setAnalyzer(cameraExecutor, QRImageAnalyzer())
it.setAnalyzer(cameraExecutor, qrImageAnalyzer)
}
//每次绑定需先解绑
......@@ -244,59 +244,5 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
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