Je travaille sur une Android qui implique un kit ML. J'ai suivi le tutoriel sur la façon de configurer Android Studio pour travailler avec Firebase. Ensuite, je me suis dirigé vers l'utilisation de l'API de reconnaissance de texte. Voici le code que j'ai dans un écouteur de clic sur un bouton:
FirebaseVisionTextRecognizer detector = FirebaseVision.getInstance()
.getOnDeviceTextRecognizer();
Task<FirebaseVisionText> result = detector.processImage(
FirebaseVisionImage.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.test))
)
.addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
@Override
public void onSuccess(FirebaseVisionText firebaseVisionText) {
System.out.println(firebaseVisionText);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
e.printStackTrace();
}
});
J'obtiens les journaux suivants:
W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.dynamite.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.dynamite.ocr:0 and remote module com.google.Android.gms.vision.dynamite.ocr:0
D/TextNativeHandle: Cannot load feature, fall back to load dynamite module.
W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.ocr:0 and remote module com.google.Android.gms.vision.ocr:0
E/Vision: Error loading module com.google.Android.gms.vision.ocr optional module true: com.google.Android.gms.dynamite.DynamiteModule$LoadingException: No acceptable module found. Local version is 0 and remote version is 0.
D/TextNativeHandle: Broadcasting download intent for dependency ocr
W/TextNativeHandle: Native handle not yet available. Reverting to no-op handle.
W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.dynamite.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.dynamite.ocr:0 and remote module com.google.Android.gms.vision.dynamite.ocr:0
D/TextNativeHandle: Cannot load feature, fall back to load dynamite module.
W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.ocr:0 and remote module com.google.Android.gms.vision.ocr:0
E/Vision: Error loading module com.google.Android.gms.vision.ocr optional module true: com.google.Android.gms.dynamite.DynamiteModule$LoadingException: No acceptable module found. Local version is 0 and remote version is 0.
W/System.err: com.google.firebase.ml.common.FirebaseMLException: Waiting for the text recognition model to be downloaded. Please wait.
at com.google.Android.gms.internal.firebase_ml.zzrw.zzd(com.google.firebase:firebase-ml-vision@@24.0.0:21)
at com.google.Android.gms.internal.firebase_ml.zzrw.zza(com.google.firebase:firebase-ml-vision@@24.0.0:39)
at com.google.Android.gms.internal.firebase_ml.zzpd.zza(com.google.firebase:firebase-ml-common@@22.0.0:31)
at com.google.Android.gms.internal.firebase_ml.zzpf.call(Unknown Source:8)
at com.google.Android.gms.internal.firebase_ml.zzoz.zza(com.google.firebase:firebase-ml-common@@22.0.0:32)
at com.google.Android.gms.internal.firebase_ml.zzoy.run(Unknown Source:4)
at Android.os.Handler.handleCallback(Handler.Java:873)
W/System.err: at Android.os.Handler.dispatchMessage(Handler.Java:99)
at com.google.Android.gms.internal.firebase_ml.zze.dispatchMessage(com.google.firebase:firebase-ml-common@@22.0.0:6)
at Android.os.Looper.loop(Looper.Java:193)
at Android.os.HandlerThread.run(HandlerThread.Java:65)
J'ai parcouru Google pour voir comment je peux corriger l'une de ces erreurs:
W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.dynamite.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.dynamite.ocr:0 and remote module com.google.Android.gms.vision.dynamite.ocr:0
D/TextNativeHandle: Cannot load feature, fall back to load dynamite module.
W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.ocr:0 and remote module com.google.Android.gms.vision.ocr:0
E/Vision: Error loading module com.google.Android.gms.vision.ocr optional module true: com.google.Android.gms.dynamite.DynamiteModule$LoadingException: No acceptable module found. Local version is 0 and remote version is 0.
W/System.err: com.google.firebase.ml.common.FirebaseMLException: Waiting for the text recognition model to be downloaded. Please wait.
Jusqu'à présent, j'ai essayé d'effacer les données des services Google Play (version 19.4.20
), redémarrage/recréation de l'émulateur, modification des configurations Gradle (par exemple, ajout/suppression de firebase-core
dépendance). Configuration au niveau du projet:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.Android.tools.build:gradle:3.5.1'
classpath 'com.google.gms:google-services:4.3.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Configuration au niveau du module d'application:
apply plugin: 'com.Android.application'
Android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.user.app"
minSdkVersion 24
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.Android.gms:play-services-vision:19.0.0'
implementation 'com.google.firebase:firebase-ml-vision:24.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
apply plugin: 'com.google.gms.google-services'
J'ai décidé d'essayer l'API Barcode et j'ai ajouté
implementation 'com.google.firebase:firebase-ml-vision-barcode-model:16.0.1'
comme dépendance. À ma grande surprise, lorsque je l'ai appelé par API, le listeur de succès a été atteint et les journaux suivants sont apparus:
I/DynamiteModule: Considering local module com.google.firebase.ml.vision.dynamite.barcode:10000 and remote module com.google.firebase.ml.vision.dynamite.barcode:0
Selected local version of com.google.firebase.ml.vision.dynamite.barcode
W/is.moneytravel: Accessing hidden field Ljava/nio/Buffer;->address:J (light greylist, reflection)
I/tflite: Initialized TensorFlow Lite runtime.
I/native: barcode_detector_client.cc:222 Not using NNAPI
Alors que l'API OCR a toujours produit la même erreur. Je pense qu'il doit gérer les référentiels dans lesquels les bibliothèques sont récupérées. API de code à barres:
Considering local module com.google.firebase.ml.vision.dynamite.barcode:10000 and remote module com.google.firebase.ml.vision.dynamite.barcode:0
API OCR:
Considering local module com.google.Android.gms.vision.dynamite.ocr:0 and remote module com.google.Android.gms.vision.dynamite.ocr:0
J'ai trop peu d'expérience avec Gradle et Firebase pour comprendre celui-ci. Pourquoi l'API OCR est-elle extraite de Android.gms
, tandis que l'API Barcode provient de firebase.ml
?
La solution était de mettre à jour l'application Google Play Services. Je ne considérais pas cela comme une option au départ, car je m'attendais à ce qu'un émulateur API 29 dispose d'un service Google Play mis à jour. Je me suis connecté à Google Play sur l'émulateur, j'ai recherché les services Google Play, l'ai désinstallé (il n'y avait pas d'option "mise à jour") et l'ai réinstallé. Il indique toujours que la version installée est 19.4.20
bien que la reconnaissance de texte ait commencé à fonctionner comme prévu. Voici quelques journaux pertinents:
W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.dynamite.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.dynamite.ocr:0 and remote module com.google.Android.gms.vision.dynamite.ocr:0
D/TextNativeHandle: Cannot load feature, fall back to load dynamite module.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.ocr:0 and remote module com.google.Android.gms.vision.ocr:1
I/DynamiteModule: Selected remote version of com.google.Android.gms.vision.ocr, version >= 1
V/DynamiteModule: Dynamite loader version >= 2, using loadModule2NoCrashUtils
Vérifiez avec moi ici avec votre code pour chacun ... Peut-être qu'il manque un
ManifestFile installLocation
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.******.***"
Android:installLocation="auto" <!-- make sure added this was missing for me -->
>
Métadonnées ManifestFile
<application
......
<meta-data
Android:name="com.google.Android.gms.version"
Android:value="@integer/google_play_services_version" /> <!--version--><!-- make sure added-->
<meta-data
Android:name="com.google.Android.gms.vision.DEPENDENCIES"
Android:value="barcode" /><!-- barcode,face,ocr make sure added-->
.......
</application>
vérifier la connexion Internet
Vérifier l'espace de stockage pour l'espace libre
si vous travaillez avec un émulateur
vérifier si un service google n'a pas de problème ==> ce n'est pas une solution, vous pouvez mettre à jour si besoin mais les étapes principales vérifient le code ci-dessus s'il est manquant (** la dernière pour l'émulateur n'est pas la solution pour l'application client réelle **)