Migration für Android

Gradle-Importe aktualisieren

Das neue SDK erfordert nur eine Abhängigkeit für jede ML Kit API. Sie müssen keine gängigen Bibliotheken wie firebase-ml-vision oder firebase-ml-natural-language angeben. ML Kit verwendet den com.google.android.gms-Namespace für Bibliotheken, die von Google Play-Diensten abhängen.

Vision APIs

Gebündelte Modelle werden im Rahmen Ihrer Anwendung bereitgestellt. Dünne Modelle müssen heruntergeladen werden. Einige APIs sind sowohl in gebündelter als auch in schmaler Form verfügbar, andere nur in einer Form oder in der anderen:

APIGebündeltDünn
Texterkennungx (Beta)x
Gesichtserkennungxx
Barcode-Scanxx
Bildbeschriftungxx
Objekterkennung und -trackingx-

Aktualisieren Sie die Abhängigkeiten für die Android ML Kit-Bibliotheken in Ihrer Gradle-Datei des Moduls (in der Regel app/build.gradle) gemäß den folgenden Tabellen:

Gebündelte Modelle

APIAlte ArtefakteNeues Artefakt
Barcode-Scan com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-barcode-model:16.0.1
com.google.mlkit:barcode-scanning:17.0.2
Gesichtskontur com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-face-model:19.0.0
com.google.mlkit:face-detection:16.1.5
Bildbeschriftung com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-image-label-model:19.0.0
com.google.mlkit:image-labeling:17.0
Objekterkennung com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-object-detection-model:19.0.3
com.google.mlkit:object-detection:17.0

Dünne Modelle

APIAlte ArtefakteNeues Artefakt
Barcode-Scan com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-barcode-scanning:18.1
Gesichtserkennung com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-face-detection:17.1
Texterkennung com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-text-recognition:18.0.2

AutoMLVision Edge

APIAltes ArtefaktNeues Artefakt
AutoML ohne Download com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:16.0.0-beta4
AutoML mit Download com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:16.0.0-beta4
com.google.mlkit:linkfirebase:17.0.0

Natural Language APIs

Gebündelte Modelle werden im Rahmen Ihrer Anwendung bereitgestellt. Alle Sprach-APIs sind gebündelte Modelle. Hier sind die neuen Artefaktnamen:

APIAlte ArtefakteNeues Artefakt
Sprach-ID com.google.firebase:firebase-ml-Natural-language:22.0.0
com.google.firebase:firebase-ml-Natural-language-language-id-model:20.0.7
com.google.mlkit:language-id:17.0.4
Intelligente Antwort com.google.firebase:firebase-ml-Natural-language:22.0.0
com.google.firebase:firebase-ml-Natural-language-smart-reply-model:20.0.7
com.google.mlkit:smart-reply:17.0.2

Kursnamen aktualisieren

Wenn Ihr Kurs in dieser Tabelle aufgeführt ist, nehmen Sie die angegebene Änderung vor:

Alter KursNeuer Kurs
com.google.firebase.ml.common.FirebaseMLException de.google.mlkit.common.MlKitException
com.google.firebase.ml.vision.common.FirebaseVisionImage com.google.mlkit.vision.common.InputImage
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector com.google.mlkit.vision.barcode.BarcodeScanner
com.google.firebase.ml.vision.labeler.FirebaseVisionImageLabel de.google.mlkit.vision.label.ImageLabeler
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector com.google.mlkit.vision.barcode.BarcodeScanner
com.google.firebase.ml.vision.automl.FirebaseAutoMLLocalModel com.google.mlkit.common.model.LocalModel
com.google.firebase.ml.vision.automl.FirebaseAutoMLRemoteModel com.google.mlkit.common.model.CustomRemoteModel
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceImageLabelerOptions com.google.mlkit.vision.label.defaults.ImageLabelerOptions
com.google.firebase.ml.vision.label.FirebaseVisionImageLabel de.google.mlkit.vision.label.ImageLabel
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceAutoMLImageLabelerOptions com.google.mlkit.vision.label.custom.CustomImageLabelerOptions
com.google.firebase.ml.vision.objects.FirebaseVisionObjectDetectorOptions com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

Beachten Sie bei anderen Kursen die folgenden Regeln:

  • Entfernen Sie das Präfix FirebaseVision aus dem Klassennamen.
  • Entfernen Sie andere Präfixe, die mit dem Präfix Firebase beginnen, aus dem Klassennamen.

Ersetze in Präfixnamen außerdem das Präfix com.google.firebase.ml durch com.google.mlkit.

Methodennamen aktualisieren

Es gibt nur minimale Änderungen am Code:

  • Detektor/Scanner/Labeler/Übersetzer... Die Instanziierung wurde geändert. Jedes Feature hat jetzt einen eigenen Einstiegspunkt. Beispiel: BarcodeScanning, TextRecognition, ImageLabeling, Translation... Aufrufe des Firebase-Dienstes getInstance() werden durch Aufrufe der Methode getClient() des Featureeintrags ersetzt.
  • Die Standardinstanzerstellung für TextRecognizer wurde entfernt, da wir zusätzliche Bibliotheken zur Erkennung anderer Skripts wie Chinesisch und Koreanisch eingeführt haben. Um die Standardoptionen mit dem Texterkennungsmodell mit lateinischer Schrift zu verwenden, deklarieren Sie eine Abhängigkeit von com.google.android.gms:play-services-mlkit-text-recognition und verwenden Sie TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • Die standardmäßige Instanziierung für ImageLabeler und ObjectDetector wurde entfernt, da die benutzerdefinierte Modellunterstützung für diese beiden Funktionen eingeführt wurde. Wenn Sie beispielsweise Standardoptionen mit Basismodell in ImageLabeling verwenden möchten, deklarieren Sie eine Abhängigkeit von com.google.mlkit:image-labeling und verwenden Sie ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) in Java.
  • Alle Ziehpunkte (Detektor/Scanner/Labeler/Übersetzer...) können geschlossen werden. Achten Sie darauf, dass die Methode close() aufgerufen wird, wenn diese Objekte nicht mehr verwendet werden. Wenn du sie in einem Fragment oder in einer AppCompatActivity verwendest, kannst du dazu beispielsweise LifecycleOwner.getLifecycle() für das Fragment oder AppCompatActivity aufrufen und dann Lifecycle.addObserver aufrufen.
  • Aus Konsistenzgründen wurden die processImage() und detectInImage() in den Vision APIs in process() umbenannt.
  • Die Natural Language APIs verwenden jetzt den Begriff „Sprach-Tag“ (gemäß BCP 47-Standard) anstelle von „Sprachcode“.
  • Getter-Methoden in xxxOptions-Klassen wurden entfernt.
  • Die Methode „getBitmap()“ in der Klasse „InputImage“ (ersetzt FirebaseVisionImage) wird im Rahmen der öffentlichen Schnittstelle nicht mehr unterstützt. In BitmapUtils.java im ML Kit-Kurzanleitungsbeispiel finden Sie Informationen dazu, wie Sie Bitmap-Dateien aus verschiedenen Eingaben konvertieren.
  • FirebaseVisionImageMetadata wurde entfernt. Sie können lediglich Bildmetadaten wie Breite, Höhe und Rotationsgrad in die Konstruktionsmethoden von InputImages übergeben.

Hier einige Beispiele für alte und neue Kotlin-Methoden:

Alt

// Construct image labeler with base model and default options.
val imageLabeler = FirebaseVision.getInstance().onDeviceImageLabeler

// Construct object detector with base model and default options.
val objectDetector = FirebaseVision.getInstance().onDeviceObjectDetector

// Construct face detector with given options
val faceDetector = FirebaseVision.getInstance().getVisionFaceDetector(options)

// Construct image labeler with local AutoML model
val localModel =
    FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build()
val autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build()
    )

Neu

// Construct image labeler with base model and default options.
val imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
// Optional: add life cycle observer
lifecycle.addObserver(imageLabeler)

// Construct object detector with base model and default options.
val objectDetector = ObjectDetection.getClient(ObjectDetectorOptions.DEFAULT_OPTIONS)

// Construct face detector with given options
val faceDetector = FaceDetection.getClient(options)

// Construct image labeler with local AutoML model
val localModel =
  LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build()
val autoMLImageLabeler =
  ImageLabeling.getClient(
    CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build())
  

Hier einige Beispiele für alte und neue Java-Methoden:

Alt

// Construct image labeler with base model and default options.
FirebaseVisionImageLabeler imagelLabeler =
     FirebaseVision.getInstance().getOnDeviceImageLabeler();

// Construct object detector with base model and default options.
FirebaseVisionObjectDetector objectDetector =
     FirebaseVision.getInstance().getOnDeviceObjectDetector();

// Construct face detector with given options
FirebaseVisionFaceDetector faceDetector =
     FirebaseVision.getInstance().getVisionFaceDetector(options);

// Construct image labeler with local AutoML model
FirebaseAutoMLLocalModel localModel =
    new FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build();
FirebaseVisionImageLabeler autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build());

Neu

// Construct image labeler with base model and default options.
ImageLabeler imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS);
// Optional: add life cycle observer
getLifecycle().addObserver(imageLabeler);

// Construct object detector with base model and default options.
ObjectDetector objectDetector = ObjectDetection.getClient(ObjectDetectorOptions.DEFAULT_OPTIONS);

// Construct face detector with given options
FaceDetector faceDetector = FaceDetection.getClient(options);

// Construct image labeler with local AutoML model
LocalModel localModel =
  new LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build();
ImageLabeler autoMLImageLabeler =
  ImageLabeling.getClient(
    new CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build());
  

API-spezifische Änderungen

Barcode scannen

Für die Barcode Scanning API gibt es jetzt zwei Möglichkeiten, die Modelle bereitzustellen:

  • Über die Google Play-Dienste „dünn“ (empfohlen): Dadurch wird die App-Größe reduziert und das Modell wird zwischen Apps geteilt. Entwickler müssen jedoch darauf achten, dass das Modell heruntergeladen wird, bevor sie es zum ersten Mal verwenden.
  • Wenn Sie das APK Ihrer App (auch als „Bundle“ bezeichnet) verwenden, wird die App-Größe erhöht, das Modell kann aber sofort verwendet werden.

Die beiden Implementierungen unterscheiden sich geringfügig: Die „Gebündelte“ Version hat gegenüber der „schlanken“ Version eine Reihe von Verbesserungen. Weitere Informationen zu diesen Unterschieden finden Sie in den Richtlinien der Barcode Scanning API.

Gesichtserkennung

Für die Face Detection API gibt es zwei Möglichkeiten, die Modelle bereitzustellen:

  • Über die Google Play-Dienste „dünn“ (empfohlen): Dadurch wird die App-Größe reduziert und das Modell wird zwischen Apps geteilt. Entwickler müssen jedoch darauf achten, dass das Modell heruntergeladen wird, bevor sie es zum ersten Mal verwenden.
  • Gebündelt oder das Bundle Ihrer App: Dadurch wird die Downloadgröße der App erhöht, das Modell kann aber sofort verwendet werden.

Das Verhalten der Implementierungen ist identisch.

Translation

  • TranslateLanguage verwendet jetzt lesbare Namen für seine Konstanten (z.B. ENGLISH) anstelle von Sprach-Tags (EN). Sie sind jetzt auch @StringDef statt @IntDef und der Wert der Konstante ist das übereinstimmende BCP 47-Sprach-Tag.

  • Wenn für Ihre App die Option „Geräte inaktiv“ als Downloadbedingung verwendet wird, wurde diese Option entfernt und kann nicht mehr verwendet werden. Sie können weiterhin die Option zum Aufladen des Geräts verwenden. Wenn Sie ein komplexeres Verhalten wünschen, können Sie den Aufruf von RemoteModelManager.download hinter Ihrer eigenen Logik verzögern.

AutoML Image Labeling

Wenn Ihre App die Option „Geräte inaktiv“ als Downloadbedingung verwendet, wurde diese Option entfernt und kann nicht mehr verwendet werden. Sie können weiterhin die Option zum Aufladen des Geräts verwenden.

Wenn Sie ein komplexeres Verhalten wünschen, können Sie den Aufruf von RemoteModelManager.download hinter Ihrer eigenen Logik verzögern.

Objekterkennung und -tracking

Wenn Ihre App die Objekterkennung mit grober Klassifizierung verwendet, beachten Sie, dass das neue SDK die Art und Weise, wie die Klassifizierungsart für erkannte Objekte zurückgegeben wird, geändert hat.

Die Klassifizierungskategorie wird als Instanz von DetectedObject.Label anstelle einer Ganzzahl zurückgegeben. Alle möglichen Kategorien für den groben Klassifikator wurden in die Klasse PredefinedCategory aufgenommen.

Hier ein Beispiel für den alten und neuen Kotlin-Code:

Alt

if (object.classificationCategory == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

Neu

if (!object.labels.isEmpty() && object.labels[0].text == PredefinedCategory.FOOD) {
    ...
}
// or
if (!object.labels.isEmpty() && object.labels[0].index == PredefinedCategory.FOOD_INDEX) {
    ...
}

Hier ein Beispiel für den alten und neuen Java-Code:

Alt

if (object.getClassificationCategory() == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

Neu

if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getText().equals(PredefinedCategory.FOOD)) {
    ...
}
// or
if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getIndex() == PredefinedCategory.FOOD_INDEX) {
    ...
}

Die Kategorie „Unbekannt“ wurde entfernt. Wenn die Klassifizierung eines Objekts gering ist, wird kein Label zurückgegeben.

Firebase-Abhängigkeiten entfernen (optional)

Dieser Schritt gilt nur, wenn die folgenden Bedingungen erfüllt sind:

  • Firebase ML Kit ist die einzige Firebase-Komponente, die Sie verwenden.
  • Sie verwenden nur On-Device-APIs.
  • Sie verwenden keine Modellbereitstellung.

In diesem Fall können Sie die Firebase-Abhängigkeiten nach der Migration entfernen. Gehen Sie so vor:

  • Entfernen Sie die Firebase-Konfigurationsdatei, indem Sie die Konfigurationsdatei „google-services.json“ im Modulverzeichnis (Ihre App-Ebene) Ihrer App löschen.
  • Ersetzen Sie das Gradle-Plug-in für Google-Dienste in Ihrer Gradle-Datei des Moduls (auf App-Ebene) (normalerweise app/build.gradle) durch das Plug-in „Strict Version Matcher“:

Vorher

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'  // Google Services plugin

android {
  // …
}

Nachher

apply plugin: 'com.android.application'
apply plugin: 'com.google.android.gms.strict-version-matcher-plugin'

android {
  // …
}
  • Ersetzen Sie den Klassenpfad des Google-Gradle-Plug-ins für Klassen in Ihrer Projekt-Gradle-Datei (root-level) (build.gradle) durch die des Strict Versions-Matcher-Plug-ins:

Vorher

buildscript {
  dependencies {
    // ...

    classpath 'com.google.gms:google-services:4.3.3'  // Google Services plugin
  }
}

Nachher

buildscript {
  dependencies {
    // ...

    classpath 'com.google.android.gms:strict-version-matcher-plugin:1.2.1'
  }
}

Löschen Sie Ihre Firebase-App in der Firebase Console entsprechend der Anleitung auf der Firebase-Supportwebsite.

Hilfe erhalten

Solltest du Probleme haben, findest du auf der Community-Seite eine Übersicht der Kanäle, über die du dich an uns wenden kannst.