diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3ab819c..c5e8cc5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -82,6 +82,7 @@
tools:replace="android:allowBackup"
tools:targetApi="s">
+
@@ -96,6 +97,7 @@
android:screenOrientation="portrait">
+
@@ -438,7 +440,13 @@
android:screenOrientation="portrait" />
+ android:exported="false"
+ android:screenOrientation="portrait" />
+
+
, Int, Int) -> Unit) :
diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/QrCodeInfoActivity.kt b/app/src/main/java/com/rehome/zhdcoa/ui/activity/QrCodeInfoActivity.kt
index fa2feac..7d7b896 100644
--- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/QrCodeInfoActivity.kt
+++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/QrCodeInfoActivity.kt
@@ -28,7 +28,7 @@ class QrCodeInfoActivity : BaseActivityOaToolbarViewBinding() {
+
+ 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(Manifest.permission.CAMERA),
+ CAMERA_REQUEST_CAMERA_SCAN
+ )
+ } else {
+ //已授权,打开摄像头扫描
+ initController()
+ }
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ 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()
+ val strList = ArrayList()
+
+ 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) {
+ 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()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_qr_code_new.xml b/app/src/main/res/layout/activity_qr_code_new.xml
new file mode 100644
index 0000000..db5c962
--- /dev/null
+++ b/app/src/main/res/layout/activity_qr_code_new.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 1db82f9..f71cdd0 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -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"