Android Studio中Google Code Scanner模拟器启动失败问题求助
Google Code Scanner在Android模拟器无法弹出扫描界面的解决方案
问题重现
在Android Studio模拟器中使用Google Code Scanner时,点击扫描按钮后无界面弹出,Logcat持续输出错误:com.google.mlkit.common.MlKitException: Waiting for the Barcode UI module to be downloaded.
已执行的排查操作:
- 通过
File > Settings > Appearance & Behavior > System Settings > Android SDK > SDK Tools安装Google Play services - 在Manifest中添加了
INTERNET、ACCESS_NETWORK_STATE、ACCESS_WIFI_STATE权限 - 真机USB连接运行时功能正常,仅模拟器出现异常
附用户提供的参考代码:
导入语句
import com.google.mlkit.vision.codescanner.GmsBarcodeScannerOptions import com.google.mlkit.vision.codescanner.GmsBarcodeScanning
AndroidManifest配置
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="barcode_ui"/>
依赖配置(build.gradle)
implementation 'com.google.android.gms:play-services-code-scanner:16.0.0' implementation 'com.google.android.gms:play-services-mlkit-barcode-scanning:18.2.0' implementation 'com.google.mlkit:barcode-scanning:17.1.0'
核心扫描代码
private fun qrScanner() { val options: GmsBarcodeScannerOptions = GmsBarcodeScannerOptions.Builder() .setBarcodeFormats( Barcode.FORMAT_QR_CODE ) .build() val scanner = GmsBarcodeScanning.getClient(this, options) scanner.startScan() .addOnSuccessListener { barcode -> val rawValue: String? = barcode.rawValue } .addOnCanceledListener { Toast.makeText( this@MainActivity, "Scanning cancelled", Toast.LENGTH_SHORT ).show() } .addOnFailureListener { e -> Log.i("MyTag", e.toString()) } binding.btnScan.setOnClickListener { scanner.startScan() } }
解决步骤
1. 更换带Google Play的模拟器镜像
模拟器必须使用包含完整Google Play服务的系统镜像(名称带「Google Play」标识,区别于「Google APIs」镜像):
- 打开AVD Manager,创建或编辑目标模拟器
- 在「系统镜像」选择步骤,挑选标注「Google Play」的版本(如Android 13 Google Play)
- 启动模拟器后,打开Play商店检查并更新Google Play服务至最新版本
2. 精简依赖配置
当前依赖存在冗余,play-services-code-scanner已包含条码扫描所需的核心功能,无需重复引入其他条码扫描依赖。修改build.gradle(Module level):
// 仅保留这一个核心依赖 implementation 'com.google.android.gms:play-services-code-scanner:16.0.0'
3. 主动触发UI模块预下载
Manifest中的meta-data声明可能无法在模拟器上自动触发模块下载,可在App启动时主动调用预下载接口:
import com.google.mlkit.common.model.DownloadConditions import com.google.mlkit.common.model.RemoteModelManager import com.google.mlkit.vision.barcode.common.BarcodeScanning // 在Application或MainActivity的onCreate方法中调用 private fun preloadBarcodeUIModule() { val remoteModelManager = RemoteModelManager.getInstance() val barcodeUiModel = BarcodeScanning.getClient().remoteModel val downloadConditions = DownloadConditions.Builder() .requireWifi() // 可根据需求调整为允许移动网络下载 .build() remoteModelManager.download(barcodeUiModel, downloadConditions) .addOnSuccessListener { // 模块下载完成,可记录日志或提示用户 } .addOnFailureListener { e -> Log.e("PreloadError", "条码UI模块下载失败: ${e.message}") } }
4. 验证模拟器网络连通性
确保模拟器能够正常访问Google服务:
- 确认模拟器右上角网络图标显示已连接
- 打开内置Chrome浏览器,尝试访问Google相关服务验证网络
- 若网络受限,可尝试切换模拟器代理设置,或更换可访问Google服务的网络环境
5. 清除Google Play服务缓存
- 在模拟器中进入「设置」→「应用」→「Google Play服务」
- 点击「存储」→「清除缓存」和「清除数据」
- 重启模拟器后重新测试扫描功能
内容的提问来源于stack exchange,提问作者Ralph Daniel Honra
相关产品推荐
相关产品推荐

