You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:27:47