From dfaa12e93a62dd07a791399e1b8ab29d63fdcc24 Mon Sep 17 00:00:00 2001 From: hwf452 Date: Tue, 25 Feb 2025 14:58:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=A0=81=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E5=BA=93=E6=9B=B4=E6=96=B0=E5=88=B0=E6=9C=80=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 10 +- .../rehome/zhdcoa/Listener/QRCodeAnalyser.kt | 2 +- .../zhdcoa/ui/activity/QrCodeInfoActivity.kt | 2 +- .../zhdcoa/ui/activity/QrCodeNewActivity.kt | 201 ++++++++++++++++++ .../main/res/layout/activity_qr_code_new.xml | 50 +++++ gradle/libs.versions.toml | 2 +- 6 files changed, 263 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/rehome/zhdcoa/ui/activity/QrCodeNewActivity.kt create mode 100644 app/src/main/res/layout/activity_qr_code_new.xml 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"