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

master
hwf452 9 months ago
parent 5b62779246
commit dfaa12e93a

@ -82,6 +82,7 @@
tools:replace="android:allowBackup"
tools:targetApi="s">
<meta-data
android:name="design_width"
android:value="768" />
@ -96,6 +97,7 @@
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
@ -438,7 +440,13 @@
android:screenOrientation="portrait" />
<activity
android:name=".ui.activity.QrCodeActivity"
android:screenOrientation="portrait" /> <!-- <activity -->
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name=".ui.activity.QrCodeNewActivity"
android:exported="false"
android:screenOrientation="portrait" />
<!-- <activity -->
<!-- android:name=".ui.activity.CaptureActivity" -->
<!-- android:screenOrientation="portrait" /> -->
<activity

@ -5,9 +5,9 @@ import android.annotation.SuppressLint
import android.util.Log
import androidx.camera.core.ImageAnalysis
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.BarcodeScanning
import com.google.mlkit.vision.barcode.common.Barcode
import com.google.mlkit.vision.common.InputImage
class QRCodeAnalyser(private val listener: (List<Barcode>, Int, Int) -> Unit) :

@ -28,7 +28,7 @@ class QrCodeInfoActivity : BaseActivityOaToolbarViewBinding<ActivityQrCodeInfoBi
binding.tvScan.setOnClickListener {
val intent = Intent(context, QrCodeActivity::class.java)
val intent = Intent(context, QrCodeNewActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
launcherResult.launch(intent)
}

@ -0,0 +1,201 @@
package com.rehome.zhdcoa.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.zhdcoa.base.BaseActivityOaToolbarViewBinding
import com.rehome.zhdcoa.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.zhdcoa.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>

@ -3,7 +3,7 @@ agp = "8.8.0"
androidxAppcompat = "1.7.0"
androidxRecyclerview = "1.4.0"
appupdate = "4.2.6"
barcodeScanning = "16.1.1"
barcodeScanning = "17.3.0"
baserecyclerviewadapterhelperVersion = "2.9.30"
bouncycastleBcpkixJdk15on = "1.67"
circleimageview = "3.1.0"

Loading…
Cancel
Save