Kotlin Android扫码弹出“Unable to access camera”Toast错误如何修复
Kotlin Android扫码
Unable to access camera错误修复方案 核心错误原因
onResume生命周期方法未做权限校验直接调用相机预览:当用户首次进入扫码页时,onResume会在权限申请弹窗返回结果之前执行,此时还没有拿到相机权限,直接调用codeScanner.startPreview()就会触发无权限访问相机的错误。
修复方案
1. 调整onResume方法逻辑
补充权限判断,只有相机权限已授予的情况下才启动扫码预览:
override fun onResume() { super.onResume() // 新增权限校验逻辑 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { codeScanner.startPreview() } }
2. 可选:补充Manifest配置
适配高版本Android规范,避免应用商店上架或者高版本系统运行异常:
<uses-permission android:name="android.permission.CAMERA" /> <!-- 声明应用需要相机硬件,required设为false代表没有相机的设备也能安装,可根据业务调整 --> <uses-feature android:name="android.hardware.camera" android:required="false" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
3. 可选:增加永久拒绝权限的引导逻辑
在onRequestPermissionsResult中判断用户是否永久拒绝了权限,引导用户到系统设置页开启:
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == MY_CAMERA_PERMISSION_REQUEST) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { codeScanner.startPreview() } else { // 判断用户是否勾选了不再询问 if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { Toast.makeText(this, "您已永久拒绝相机权限,请到系统设置中开启后使用扫码功能", Toast.LENGTH_LONG).show() // 可在此处弹出弹窗,引导用户跳转到设置页 } else { Toast.makeText(this, "需要相机权限才能使用扫码功能", Toast.LENGTH_LONG).show() } } } }
其他排查项
- 检查测试设备的相机是否被其他应用占用,或者模拟器是否已经配置了可用的相机硬件
- 确认你使用的扫码库版本适配了你当前的测试系统版本
内容的提问来源于stack exchange,提问作者user17056863
相关产品推荐
相关产品推荐

