This commit is contained in:
HapeLee committed 2025-06-04 13:33:51 +08:00
1 parent b86d90021c
commit 6c0757c91b
972 files changed
+6885 -7321

No files matched your search

@@ -0,0 +1,56 @@
package io.legato.kazusa.ui.qrcode
import android.content.Intent
import android.graphics.BitmapFactory
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import com.google.zxing.Result
import io.legato.kazusa.R
import io.legato.kazusa.base.BaseActivity
import io.legato.kazusa.databinding.ActivityQrcodeCaptureBinding
import io.legato.kazusa.utils.QRCodeUtils
import io.legato.kazusa.utils.SelectImageContract
import io.legato.kazusa.utils.launch
import io.legato.kazusa.utils.readBytes
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
class QrCodeActivity : BaseActivity<ActivityQrcodeCaptureBinding>(), ScanResultCallback {
override val binding by viewBinding(ActivityQrcodeCaptureBinding::inflate)
private val selectQrImage = registerForActivityResult(SelectImageContract()) {
it.uri?.readBytes(this)?.let { bytes ->
val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
onScanResultCallback(QRCodeUtils.parseCodeResult(bitmap))
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
val fTag = "qrCodeFragment"
val qrCodeFragment = QrCodeFragment()
supportFragmentManager.beginTransaction()
.replace(R.id.fl_content, qrCodeFragment, fTag)
.commit()
}
override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.qr_code_scan, menu)
return super.onCompatCreateOptionsMenu(menu)
}
override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_choose_from_gallery -> selectQrImage.launch()
}
return super.onCompatOptionsItemSelected(item)
}
override fun onScanResultCallback(result: Result?) {
val intent = Intent()
intent.putExtra("result", result?.text)
setResult(RESULT_OK, intent)
finish()
}
}
@@ -0,0 +1,33 @@
package io.legato.kazusa.ui.qrcode
import com.google.zxing.Result
import com.king.camera.scan.AnalyzeResult
import com.king.camera.scan.CameraScan
import com.king.zxing.BarcodeCameraScanFragment
import com.king.zxing.DecodeConfig
import com.king.zxing.DecodeFormatManager
import com.king.zxing.analyze.MultiFormatAnalyzer
class QrCodeFragment : BarcodeCameraScanFragment() {
override fun initCameraScan(cameraScan: CameraScan<Result>) {
super.initCameraScan(cameraScan)
//初始化解码配置
val decodeConfig = DecodeConfig()
//如果只有识别二维码的需求,这样设置效率会更高,不设置默认为DecodeFormatManager.DEFAULT_HINTS
decodeConfig.hints = DecodeFormatManager.QR_CODE_HINTS
//设置是否全区域识别,默认false
decodeConfig.isFullAreaScan = true
//设置识别区域比例,默认0.8,设置的比例最终会在预览区域裁剪基于此比例的一个矩形进行扫码识别
decodeConfig.areaRectRatio = 0.8f
//在启动预览之前,设置分析器,只识别二维码
cameraScan.setAnalyzer(MultiFormatAnalyzer(decodeConfig))
}
override fun onScanResultCallback(result: AnalyzeResult<Result>) {
cameraScan.setAnalyzeImage(false)
(activity as? QrCodeActivity)?.onScanResultCallback(result.result)
}
}
@@ -0,0 +1,23 @@
package io.legato.kazusa.ui.qrcode
import android.app.Activity.RESULT_OK
import android.content.Context
import android.content.Intent
import androidx.activity.result.contract.ActivityResultContract
class QrCodeResult : ActivityResultContract<Unit?, String?>() {
override fun createIntent(context: Context, input: Unit?): Intent {
return Intent(context, QrCodeActivity::class.java)
}
override fun parseResult(resultCode: Int, intent: Intent?): String? {
if (resultCode == RESULT_OK) {
intent?.getStringExtra("result")?.let {
return it
}
}
return null
}
}
@@ -0,0 +1,9 @@
package io.legato.kazusa.ui.qrcode
import com.google.zxing.Result
interface ScanResultCallback {
fun onScanResultCallback(result: Result?)
}