如何确保ML Kit人脸检测模型首次使用前下载及主动下载等操作?
背景
采用Google Play Services的ML Kit "thin"模式时,模型需在首次使用前完成下载,日志中出现如下模型未加载错误:
2024-10-10 10:32:54.762 8519-8519 MobileVisionBase com.metsakuur.ufacemangopublic E Error preloading model resource com.google.mlkit.common.MlKitException: Waiting for the face module to be downloaded. Please wait. at com.google.mlkit.vision.face.internal.zza.zzd(com.google.android.gms:play-services-mlkit-face-detection@@17.1.0:10) at com.google.mlkit.vision.face.internal.zzh.load(com.google.android.gms:play-services-mlkit-face-detection@@17.1.0:1) at com.google.mlkit.common.sdkinternal.ModelResource.zza(com.google.mlkit:common@@18.5.0:4) at com.google.mlkit.common.sdkinternal.zzn.run(Unknown Source:10) at com.google.mlkit.common.sdkinternal.zzt.run(com.google.mlkit:common@@18.5.0:2) at com.google.mlkit.common.sdkinternal.MlKitThreadPool.zze(com.google.mlkit:common@@18.5.0:4) at com.google.mlkit.common.sdkinternal.MlKitThreadPool.zzc(com.google.mlkit:common@@18.5.0:1) at com.google.mlkit.common.sdkinternal.zzk.run(Unknown Source:2) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at com.google.mlkit.common.sdkinternal.MlKitThreadPool.zzd(com.google.mlkit:common@@18.5.0:2) at com.google.mlkit.common.sdkinternal.zzi.run(Unknown Source:2) at java.lang.Thread.run(Thread.java:1012) Caused by: com.google.android.gms.dynamite.DynamiteModule$LoadingException: No acceptable module com.google.android.gms.vision.face found. Local version is 0 and remote version is 0. at com.google.android.gms.dynamite.DynamiteModule.load(com.google.android.gms:play-services-basement@@18.1.0:67) at com.google.mlkit.vision.face.internal.zza.zze(com.google.android.gms:play-services-mlkit-face-detection@@17.1.0:1) at com.google.mlkit.vision.face.internal.zza.zzg(com.google.android.gms:play-services-mlkit-face-detection@@17.1.0:2) at com.google.mlkit.vision.face.internal.zza.zzf(com.google.android.gms:play-services-mlkit-face-detection@@17.1.0:22) at com.google.mlkit.vision.face.internal.zza.zzd(com.google.android.gms:play-services-mlkit-face-detection@@17.1.0:5)
问题解答
1. 主动触发模型下载
通过ModelManager的download方法主动触发,以人脸检测模型为例:
// 获取对应模型的标识符 ModelIdentifier faceModelId = FaceDetectionModelIdentifier.FACE_DETECTION_V1; // 获取ModelManager实例 ModelManager modelManager = ModelManager.getInstance(); // 发起下载请求 modelManager.download(faceModelId) .addOnSuccessListener(aVoid -> { // 下载成功后的处理逻辑 }) .addOnFailureListener(e -> { // 下载失败的异常处理 });
2. 确认模型是否已下载
调用isModelDownloaded方法直接检查状态:
boolean isFaceModelDownloaded = modelManager.isModelDownloaded(faceModelId);
3. 查看下载进度
配置下载条件后,通过addOnProgressListener监听实时进度:
// 配置下载条件(示例:仅WiFi环境下下载) ModelDownloadConditions conditions = new ModelDownloadConditions.Builder() .requireWifi() .build(); modelManager.download(faceModelId, conditions) .addOnProgressListener(progress -> { int percentage = (int) (progress.getBytesDownloaded() * 100.0 / progress.getTotalBytes()); // 更新UI或记录进度 });
4. 模型格式
这类通过Google Play Services分发的ML Kit模型是Dynamite模块,并非标准APK格式。Dynamite是Google Play Services专属的模块化组件分发机制,模块以定制压缩格式存储,由Google Play Services统一管理。
5. 单独预装到设备
可以通过以下方式实现预装:
- 针对定制ROM或企业管控设备,将对应Dynamite模块(后缀为
.apk的专用模块文件,对应组件名com.google.android.gms.vision.face)放置到设备系统分区的/system/priv-app/目录下。 - 需确保模块版本与设备上的Google Play Services版本兼容,否则会出现加载失败问题。
内容的提问来源于stack exchange,提问作者胡倍业
相关产品推荐
相关产品推荐

