二维码扫描库更新到最新版本

master
hwf452 9 months ago
parent 5f1cb6ea91
commit 2d8c5e5f55

@ -129,6 +129,10 @@
android:name=".ui.activity.QrCodeActivity" android:name=".ui.activity.QrCodeActivity"
android:exported="false" android:exported="false"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity
android:name=".ui.activity.QrCodeNewActivity"
android:exported="false"
android:screenOrientation="portrait" />
<activity <activity
android:name=".ui.activity.SisBaseActivity" android:name=".ui.activity.SisBaseActivity"
android:exported="false" android:exported="false"

@ -6,9 +6,9 @@ import android.annotation.SuppressLint
import android.util.Log import android.util.Log
import androidx.camera.core.ImageAnalysis import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageProxy import androidx.camera.core.ImageProxy
import com.google.mlkit.vision.barcode.Barcode
import com.google.mlkit.vision.barcode.BarcodeScannerOptions import com.google.mlkit.vision.barcode.BarcodeScannerOptions
import com.google.mlkit.vision.barcode.BarcodeScanning import com.google.mlkit.vision.barcode.BarcodeScanning
import com.google.mlkit.vision.barcode.common.Barcode
import com.google.mlkit.vision.common.InputImage import com.google.mlkit.vision.common.InputImage
class QRCodeAnalyser(private val listener: (List<Barcode>, Int, Int) -> Unit) : class QRCodeAnalyser(private val listener: (List<Barcode>, Int, Int) -> Unit) :
@ -23,7 +23,7 @@ class QRCodeAnalyser(private val listener: (List<Barcode>, Int, Int) -> Unit) :
//获取解析器 //获取解析器
private val detector = BarcodeScanning.getClient(options) private val detector = BarcodeScanning.getClient(options)
@SuppressLint("UnsafeExperimentalUsageError", "UnsafeOptInUsageError") @SuppressLint("UnsafeOptInUsageError")
override fun analyze(imageProxy: ImageProxy) { override fun analyze(imageProxy: ImageProxy) {
val mediaImage = imageProxy.image ?: kotlin.run { val mediaImage = imageProxy.image ?: kotlin.run {
imageProxy.close() imageProxy.close()
@ -32,8 +32,8 @@ class QRCodeAnalyser(private val listener: (List<Barcode>, Int, Int) -> Unit) :
val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees) val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
detector.process(image) detector.process(image)
.addOnSuccessListener { barCodes -> .addOnSuccessListener { barCodes ->
Log.i("app", "barCodes: ${barCodes.size}")
if (barCodes.size > 0) { if (barCodes.size > 0) {
Log.i("app", "barCodes: ${barCodes.size}")
listener.invoke(barCodes, imageProxy.width, imageProxy.height) listener.invoke(barCodes, imageProxy.width, imageProxy.height)
//接收到结果后,就关闭解析 //接收到结果后,就关闭解析
detector.close() detector.close()

@ -20,6 +20,7 @@ import com.rehome.dywoa.base.BaseActivityOaToolbarViewBinding
import java.util.concurrent.ExecutorService import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors import java.util.concurrent.Executors
/** /**
* date:2025/02/13 10:05:28 * date:2025/02/13 10:05:28
* author:HuangWenfei * author:HuangWenfei
@ -31,12 +32,6 @@ class QrCodeActivity : BaseActivityOaToolbarViewBinding<ActivityQrCodeBinding>()
private lateinit var cameraExecutor: ExecutorService private lateinit var cameraExecutor: ExecutorService
private val CAMERA_REQUEST_CAMERA_SCAN: Int = 88 //请求码 private val CAMERA_REQUEST_CAMERA_SCAN: Int = 88 //请求码
// override fun onCreate(savedInstanceState: Bundle?) {
// super.onCreate(savedInstanceState)
// binding = ActivityQrCodeBinding.inflate(layoutInflater)
// setContentView(binding.root)
// initController()
// }
override fun getViewBinding() = ActivityQrCodeBinding.inflate(layoutInflater) override fun getViewBinding() = ActivityQrCodeBinding.inflate(layoutInflater)
@ -127,12 +122,6 @@ class QrCodeActivity : BaseActivityOaToolbarViewBinding<ActivityQrCodeBinding>()
barcode.boundingBox?.let { rect -> barcode.boundingBox?.let { rect ->
val translateRect = translateRect(rect) val translateRect = translateRect(rect)
list.add(translateRect) list.add(translateRect)
// Log.e(
// "ztzt", "left${translateRect.left} +" +
// " top${translateRect.top} + right${translateRect.right}" +
// " + bottom${translateRect.bottom}"
// )
// Log.e("ztzt", "barcode.rawValue${barcode.rawValue}")
strList.add(barcode.rawValue ?: "No Value") strList.add(barcode.rawValue ?: "No Value")
} }
} }

@ -0,0 +1,201 @@
package com.rehome.dywoa.ui.activity
import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Rect
import android.graphics.RectF
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.camera.core.ImageCapture
import androidx.camera.view.LifecycleCameraController
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
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.common.InputImage
import com.rehome.dywoa.base.BaseActivityOaToolbarViewBinding
import com.rehome.dywoa.databinding.ActivityQrCodeNewBinding
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
/**
* date:2025/02/25 14:05:28
* author:HuangWenfei
* description:二维码扫描
*/
class QrCodeNewActivity : BaseActivityOaToolbarViewBinding<ActivityQrCodeNewBinding>() {
private lateinit var lifecycleCameraController: LifecycleCameraController
private lateinit var cameraExecutor: ExecutorService
private val CAMERA_REQUEST_CAMERA_SCAN: Int = 88 //请求码
override fun getViewBinding() = ActivityQrCodeNewBinding.inflate(layoutInflater)
override fun getToolbar() = binding.toolbarView.toolbar
override fun initView() {
initToolbar("二维码/条码扫描")
setLeftOnClickListener { finish() }
checkPermission()
}
override fun initData() {
}
private fun checkPermission() {
//检测摄像头权限
if (!context.packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) {
binding.frCamera.visibility = View.GONE
Toast.makeText(
context,
"权限拒绝,请手动设置开启APP访问摄像头权限",
Toast.LENGTH_LONG
).show()
return
}
//动态权限申请
if (ContextCompat.checkSelfPermission(
context,
Manifest.permission.CAMERA
) != PackageManager.PERMISSION_GRANTED
) {
binding.frCamera.visibility = View.GONE
//权限请求
ActivityCompat.requestPermissions(
this,
arrayOf<String>(Manifest.permission.CAMERA),
CAMERA_REQUEST_CAMERA_SCAN
)
} else {
//已授权,打开摄像头扫描
initController()
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (CAMERA_REQUEST_CAMERA_SCAN == requestCode) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
binding.frCamera.visibility = View.VISIBLE
//已授权,打开摄像头扫描
initController()
} else {
binding.frCamera.visibility = View.GONE
//权限拒绝
Toast.makeText(
this,
"权限拒绝,请手动设置开启APP访问摄像头权限",
Toast.LENGTH_SHORT
).show()
}
}
}
@SuppressLint("UnsafeOptInUsageError")
private fun initController() {
//配置当前扫码格式
val options = BarcodeScannerOptions.Builder()
.setBarcodeFormats(
Barcode.FORMAT_QR_CODE,
Barcode.FORMAT_AZTEC
).build()
//获取解析器
val detector = BarcodeScanning.getClient(options)
cameraExecutor = Executors.newSingleThreadExecutor()
lifecycleCameraController = LifecycleCameraController(this)
lifecycleCameraController.bindToLifecycle(this)
lifecycleCameraController.imageCaptureFlashMode = ImageCapture.FLASH_MODE_AUTO
lifecycleCameraController.setImageAnalysisAnalyzer(
cameraExecutor
) { imageProxy ->
val mediaImage = imageProxy.image
if (mediaImage != null) {
val image = InputImage.fromMediaImage(
mediaImage,
imageProxy.imageInfo.rotationDegrees
)
detector.process(image)
.addOnSuccessListener { barCodes ->
if (barCodes.size > 0) {
showLog("barCodes: ${barCodes.size}")
//接收到结果后,就关闭解析
detector.close()
initScale(image.width, image.height)
val list = ArrayList<RectF>()
val strList = ArrayList<String>()
barCodes.forEach { barcode ->
barcode.boundingBox?.let { rect ->
val translateRect = translateRect(rect)
list.add(translateRect)
strList.add(barcode.rawValue ?: "No Value")
}
}
binding.scanView.setRectList(list)
judgeIntent(strList)
}
}
.addOnFailureListener {
showLog("Error: ${it.message}")
}
.addOnCompleteListener {
imageProxy.close()
}
}
}
binding.previewView.controller = lifecycleCameraController
}
private fun judgeIntent(list: ArrayList<String>) {
val sb = StringBuilder()
list.forEach {
sb.append(it)
}
intentToResult(sb.toString().trim())
}
private fun intentToResult(result: String) {
val resultIntent = Intent()
val bundle = Bundle()
bundle.putString("code", result)
resultIntent.putExtras(bundle)
setResult(RESULT_OK, resultIntent)
finish();
}
private var scaleX = 0f
private var scaleY = 0f
private fun translateX(x: Float): Float = x * scaleX
private fun translateY(y: Float): Float = y * scaleY
//将扫描的矩形换算为当前屏幕大小
private fun translateRect(rect: Rect) = RectF(
translateX(rect.left.toFloat()),
translateY(rect.top.toFloat()),
translateX(rect.right.toFloat()),
translateY(rect.bottom.toFloat())
)
//初始化缩放比例
private fun initScale(imageWidth: Int, imageHeight: Int) {
scaleY = binding.scanView.height.toFloat() / imageWidth.toFloat()
scaleX = binding.scanView.width.toFloat() / imageHeight.toFloat()
}
}

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.activity.QrCodeNewActivity">
<include
android:id="@+id/toolbarView"
layout="@layout/layout_base" />
<FrameLayout
android:id="@+id/fr_camera"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.camera.view.PreviewView
android:id="@+id/previewView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/scan_bg"
android:orientation="vertical">
<com.rehome.dywoa.weiget.ScanView
android:id="@+id/scanView"
android:layout_width="250dp"
android:layout_height="250dp"
android:background="@android:color/transparent" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:textSize="16sp"
android:textColor="#666666"
android:textStyle="bold"
android:text="@string/scan_text"/>
</LinearLayout>
</FrameLayout>
</LinearLayout>

@ -33,7 +33,8 @@ recyclerview = "1.4.0"
retrofit = "2.9.0" retrofit = "2.9.0"
smarttable = "2.2.0" smarttable = "2.2.0"
squareupPicasso = "2.5.2" squareupPicasso = "2.5.2"
barcodeScanning = "16.1.1" barcodeScanning = "17.3.0"
facedetection = "16.1.7"
supportV4 = "28.0.0" supportV4 = "28.0.0"
xui = "1.2.1" xui = "1.2.1"
@ -52,7 +53,8 @@ bcprov-jdk15on = { module = "org.bouncycastle:bcprov-jdk15on", version.ref = "bc
camerax = { module = "io.github.lucksiege:camerax", version.ref = "pictureselector" } camerax = { module = "io.github.lucksiege:camerax", version.ref = "pictureselector" }
circleimageview = { module = "de.hdodenhof:circleimageview", version.ref = "circleimageview" } circleimageview = { module = "de.hdodenhof:circleimageview", version.ref = "circleimageview" }
cn-hutool-all = { module = "cn.hutool:hutool-all", version.ref = "hutoolAllVersion" } cn-hutool-all = { module = "cn.hutool:hutool-all", version.ref = "hutoolAllVersion" }
com-google-mlkit-face-detection2 = { module = "com.google.mlkit:face-detection", version.ref = "barcodeScanning" } com-google-mlkit-face-detection2 = { module = "com.google.mlkit:face-detection", version.ref = "facedetection" }
barcode-scanning = { module = "com.google.mlkit:barcode-scanning", version.ref = "barcodeScanning" }
com-squareup-picasso-picasso = { module = "com.squareup.picasso:picasso", version.ref = "squareupPicasso" } com-squareup-picasso-picasso = { module = "com.squareup.picasso:picasso", version.ref = "squareupPicasso" }
com-squareup-retrofit2-converter-gson5 = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" } com-squareup-retrofit2-converter-gson5 = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" }
commons-codec-commons-codec4 = { module = "commons-codec:commons-codec", version.ref = "commonsCodecCommonsCodec2" } commons-codec-commons-codec4 = { module = "commons-codec:commons-codec", version.ref = "commonsCodecCommonsCodec2" }
@ -70,7 +72,6 @@ logging-interceptor = { module = "com.squareup.okhttp3:logging-interceptor", ver
material = { group = "com.google.android.material", name = "material", version.ref = "material" } material = { group = "com.google.android.material", name = "material", version.ref = "material" }
androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
barcode-scanning = { module = "com.google.mlkit:barcode-scanning", version.ref = "barcodeScanning" }
paho-org-eclipse-paho-android-service = { module = "org.eclipse.paho:org.eclipse.paho.android.service", version.ref = "orgEclipsePahoAndroidServiceVersion" } paho-org-eclipse-paho-android-service = { module = "org.eclipse.paho:org.eclipse.paho.android.service", version.ref = "orgEclipsePahoAndroidServiceVersion" }
paho-org-eclipse-paho-client-mqttv3 = { module = "org.eclipse.paho:org.eclipse.paho.client.mqttv3", version.ref = "orgEclipsePahoClientMqttv3Version" } paho-org-eclipse-paho-client-mqttv3 = { module = "org.eclipse.paho:org.eclipse.paho.client.mqttv3", version.ref = "orgEclipsePahoClientMqttv3Version" }
photoviewer = { module = "com.github.wanglu1209:PhotoViewer", version.ref = "photoviewer" } photoviewer = { module = "com.github.wanglu1209:PhotoViewer", version.ref = "photoviewer" }

Loading…
Cancel
Save