Android Kotlin二维码扫描器可识别二维码,但无法跳转至默认浏览器
问题原因与修复方案
你的代码核心问题是扫描结果的获取逻辑完全错误:
你直接在Activity初始化阶段(比如onCreate)读取intent.getStringExtra(RESULT),但这只能拿到启动当前Activity时传入的参数,而ZXing扫描完成后的结果是通过Activity返回机制传递的,不会更新当前Activity的intent对象,所以这段代码只会在Activity第一次启动时执行一次,扫描完成返回后根本不会触发,自然拿不到结果,也就没任何反应。
修复方案(分两种场景)
场景1:使用旧版ZXing IntentIntegrator(未适配AndroidX)
保留你的点击事件逻辑,删掉直接获取result的代码,然后重写onActivityResult来接收扫描结果:
// 点击事件保留 binding.scanQR.setOnClickListener() { val scanner = IntentIntegrator(this) scanner.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE) scanner.setBeepEnabled(false) scanner.initiateScan() } // 重写onActivityResult接收扫描结果 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) // 用IntentIntegrator解析返回结果 val scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data) if (scanResult != null) { if (scanResult.contents == null) { // 这里可以处理用户取消扫描的情况 } else { // 处理扫描到的内容 handleScanContent(scanResult.contents) } } } // 把原来的处理逻辑抽成独立方法 private fun handleScanContent(content: String) { if (content.contains("https://") || content.contains("http://")) { val intent = Intent(Intent.ACTION_VIEW, Uri.parse(content)) startActivity(intent) } else { binding.scanQR.text = content } }
场景2:使用新版ZXing IntentIntegrator(适配AndroidX,推荐)
AndroidX已经废弃了onActivityResult,改用registerForActivityResult来处理返回结果,写法如下:
// 先定义扫描结果的启动器 private val scanResultLauncher = registerForActivityResult(IntentIntegrator.ActivityResultContracts.StartScan()) { result -> if (result.contents == null) { // 用户取消扫描,可添加提示逻辑 } else { handleScanContent(result.contents) } } // 点击事件改为调用launch方法 binding.scanQR.setOnClickListener { val scanner = IntentIntegrator(this) scanner.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE) scanner.setBeepEnabled(false) // 传递扫描Intent给启动器 scanResultLauncher.launch(scanner.createScanIntent()) } // 统一的结果处理方法 private fun handleScanContent(content: String) { if (content.contains("https://") || content.contains("http://")) { val intent = Intent(Intent.ACTION_VIEW, Uri.parse(content)) startActivity(intent) } else { binding.scanQR.text = content } }
内容的提问来源于stack exchange,提问作者KokaDoodles
相关产品推荐
相关产品推荐

