Migracja na Androida

Z tego przewodnika dowiesz się, jak przeprowadzić migrację z ML Kit for Firebase na Androida.

Aktualizowanie importów Gradle

Pakiet SDK ML Kit wymaga tylko 1 zależności dla każdego interfejsu ML Kit API. Nie musisz określać popularnych bibliotek, takich jak firebase-ml-vision czy firebase-ml-natural-language. ML Kit używa przestrzeni nazw com.google.android.gms w przypadku bibliotek, które zależą od Usług Google Play.

Interfejsy Vision API

Modele połączone są dostarczane jako część aplikacji. Modele cienkie trzeba pobrać. Niektóre interfejsy API są dostępne w wersji połączonej i cienkiej, a inne tylko w jednej z nich:

Interfejs APIŁączenie w pakietyCienka
Rozpoznawanie tekstux (beta)x
Wykrywanie twarzyxx
Skanowanie kodów kreskowychxx
Dodawanie etykiet do obrazówxx
Wykrywanie i śledzenie obiektówx-

Zaktualizuj zależności bibliotek ML Kit na Androida w pliku Gradle na poziomie modułu (aplikacji) (zwykle app/build.gradle.kts) zgodnie z tabelami poniżej:

Modele połączone

Interfejs APIStare artefaktyNowy artefakt
Skanowanie kodów kreskowych 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.3.0
Kontur twarzy 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.7
Dodawanie etykiet do obrazów 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.9
Wykrywanie obiektów 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.2

Modele cienkie

Interfejs APIStare artefaktyNowy artefakt
Skanowanie kodów kreskowych com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1
Wykrywanie twarzy com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-face-detection:17.1.0
Rozpoznawanie tekstu com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-text-recognition:19.0.1

AutoMLVision Edge

Interfejs APIStary artefaktNowy artefakt
AutoML bez pobierania 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:17.0.3
AutoML z pobieraniem 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:17.0.3

Aby hostować i pobierać modele niestandardowe, przenieś je do Cloud Storage i dodaj w aplikacji logikę pobierania, aby je wczytywać za pomocą LocalModel. Więcej informacji znajdziesz w przewodniku po migracji z Firebase ML do Cloud Storage.

Interfejsy Natural Language API

Modele połączone są dostarczane jako część aplikacji. Modele cienkie trzeba pobrać:

Interfejs APIŁączenie w pakietyCienka
Identyfikator językaxx
Inteligentna odpowiedźxx (beta)

Zaktualizuj zależności bibliotek ML Kit na Androida w pliku Gradle na poziomie modułu (aplikacji) (zwykle app/build.gradle.kts) zgodnie z tabelami poniżej:

Modele połączone

Interfejs APIStare artefaktyNowy artefakt
Identyfikator języka 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.6
Inteligentna odpowiedź 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.4

Modele cienkie

Interfejs APIStare artefaktyNowy artefakt
Identyfikator języka 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.android.gms:play-services-mlkit-language-id:17.0.0
Inteligentna odpowiedź 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.android.gms:play-services-mlkit-smart-reply:16.0.0-beta1

Aktualizowanie nazw zajęć

Jeśli Twoja klasa znajduje się w tej tabeli, wprowadź wskazaną zmianę:

Stara klasaNowe zajęcia
com.google.firebase.ml.common.FirebaseMLException com.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 com.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.LocalModel

Wymaga ręcznego pobrania. Modele zdalne hostowane w Firebase zostały wycofane. Więcej informacji znajdziesz w przewodniku po migracji z Firebase ML do Cloud Storage.
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceImageLabelerOptions com.google.mlkit.vision.label.defaults.ImageLabelerOptions
com.google.firebase.ml.vision.label.FirebaseVisionImageLabel com.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

W przypadku innych klas postępuj zgodnie z tymi regułami:

  • Usuń prefiks FirebaseVision z nazwy klasy.
  • Usuń inne prefiksy, które zaczynają się od prefiksu Firebase w nazwie klasy.

W nazwach pakietów zastąp też prefiks com.google.firebase.ml prefiksem com.google.mlkit.

Aktualizowanie nazw metod

Wymagane są minimalne zmiany w kodzie:

  • Zmieniono sposób tworzenia instancji detektora, skanera, etykietowania, tłumacza itp. Każda funkcja ma teraz własny punkt wejścia. Na przykład: BarcodeScanning, TextRecognition, ImageLabeling, Translation... Wywołania usługi Firebase getInstance() są zastępowane wywołaniami metody getClient() punktu wejścia funkcji.
  • Usunięto domyślne tworzenie instancji TextRecognizer, ponieważ wprowadziliśmy dodatkowe biblioteki do rozpoznawania innych skryptów, takich jak chiński i koreański. Aby używać opcji domyślnych z modelem rozpoznawania tekstu w alfabecie łacińskim, zadeklaruj zależność od com.google.android.gms:play-services-mlkit-text-recognition i użyj TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • Usunięto domyślne tworzenie instancji ImageLabeler i ObjectDetector, ponieważ wprowadziliśmy obsługę modeli niestandardowych w przypadku tych 2 funkcji. Aby na przykład używać opcji domyślnych z modelem podstawowym w ImageLabeling, zadeklaruj zależność od com.google.mlkit:image-labeling i użyj ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) w Javie.
  • Wszystkie uchwyty (detektor, skaner, etykietowanie, tłumacz itp.) można zamknąć. Gdy te obiekty nie będą już używane, wywołaj metodę close(). Jeśli używasz ich w Fragment lub AppCompatActivity, możesz to zrobić, wywołując LifecycleOwner.getLifecycle() w Fragment lub AppCompatActivity, a następnie wywołując Lifecycle.addObserver.
  • Aby zachować spójność, nazwy processImage() i detectInImage() w interfejsach Vision API zostały zmienione na process().
  • Interfejsy Natural Language API używają teraz terminu „tag języka” (zgodnie ze standardem BCP 47) zamiast „kodu języka”.
  • Usunięto metody pobierania w klasach xxxOptions.
  • Metoda getBitmap() w klasie InputImage (zastępująca FirebaseVisionImage) nie jest już obsługiwana w ramach interfejsu publicznego. Aby uzyskać bitmapę przekonwertowaną z różnych danych wejściowych, zapoznaj się z plikiem BitmapUtils.java w przykładowym projekcie ML Kit.
  • Usunięto FirebaseVisionImageMetadata. Możesz po prostu przekazać metadane obrazu, takie jak width, height, rotationDegrees, format, do metod konstrukcyjnych InputImage.

Oto kilka przykładów starych i nowych metod Kotlin:

Stary

// 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()
    )

Nowy

// Construct image labeler with base model and default options.
val imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
// Optional: add lifecycle 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())
  

Oto kilka przykładów starych i nowych metod Java:

Stary

// 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());

Nowy

// Construct image labeler with base model and default options.
ImageLabeler imageLabeler = ImageLabeling.getClient(
    ImageLabelerOptions.DEFAULT_OPTIONS
);
// Optional: add lifecycle 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());
  

Zmiany dotyczące interfejsu API

Skanowanie kodów kreskowych

W przypadku interfejsu Barcode Scanning API modele można teraz dostarczać na 2 sposoby:

  • Za pomocą Usług Google Play, czyli „cienki” (zalecany) – zmniejsza rozmiar aplikacji, a model jest współdzielony między aplikacjami. Deweloperzy będą jednak musieli się upewnić, że model został pobrany przed pierwszym użyciem.
  • W pliku APK aplikacji, czyli „połączony” – zwiększa rozmiar aplikacji, ale model jest od razu gotowy do użycia.

Te 2 implementacje różnią się nieco od siebie, a wersja „połączona” ma kilka ulepszeń w porównaniu z wersją „cienką”. Szczegółowe informacje o tych różnicach znajdziesz we wskazówkach dotyczących interfejsu Barcode Scanning API.

Wykrywanie twarzy

W przypadku interfejsu Face Detection API modele można dostarczać na 2 sposoby:

  • Za pomocą Usług Google Play, czyli „cienki” (zalecany) – zmniejsza rozmiar aplikacji, a model jest współdzielony między aplikacjami. Deweloperzy będą jednak musieli się upewnić, że model został pobrany przed pierwszym użyciem.
  • W pliku APK aplikacji, czyli „połączony” – zwiększa rozmiar pobierania aplikacji , ale model jest od razu gotowy do użycia.

Działanie tych implementacji jest takie samo.

Tłumaczenie

  • TranslateLanguage używa teraz czytelnych nazw stałych (np. ENGLISH) zamiast tagów języka (EN). Są one też teraz @StringDef, zamiast @IntDef, a wartością stałej jest pasujący tag języka BCP 47.

AutoML Image Labeling (wycofane)

Pobieranie modeli niestandardowych do etykietowania obrazów za pomocą AutoML zostało wycofane i zostanie wyłączone 15 czerwca 2027 r. Zamiast tego używaj Cloud Storage do hostowania modeli i dodaj do aplikacji logikę pobierania, aby pobierać modele. Więcej informacji znajdziesz w przewodniku po migracji z Firebase ML do Cloud Storage.

Wykrywanie i śledzenie obiektów

Jeśli Twoja aplikacja używa wykrywania obiektów z klasyfikacją przybliżoną, pamiętaj, że nowy pakiet SDK zmienił sposób zwracania kategorii klasyfikacji wykrytych obiektów.

Kategoria klasyfikacji jest zwracana jako instancja DetectedObject.Label zamiast liczby całkowitej. Wszystkie możliwe kategorie klasyfikatora przybliżonego są zawarte w klasie PredefinedCategory.

Oto przykład starego i nowego kodu Kotlin:

Stary

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

Nowy

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

Oto przykład starego i nowego kodu Java:

Stary

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

Nowy

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) {
    ...
}

Usunięto kategorię „nieznane”. Gdy wiarygodność klasyfikacji obiektu jest niska, nie zwracamy żadnej etykiety.

Usuwanie zależności Firebase

Po migracji usuń zależności Firebase. Aby to zrobić:

  • Usuń plik konfiguracyjny Firebase, usuwając plik konfiguracyjny google-services.json w katalogu modułu (na poziomie aplikacji) aplikacji.
  • Zastąp wtyczkę Gradle Usług Google w pliku Gradle na poziomie modułu (aplikacji) (zwykle app/build.gradle.kts) wtyczką Strict Version Matcher:

Przed

plugins {
  id("com.android.application")
  id("com.google.gms.google-services")
}

android {
  // …
}

Po

plugins {
  id("com.android.application")
  id("com.google.android.gms.strict-version-matcher-plugin")
}

android {
  // …
}
  • Zastąp ścieżkę klasy wtyczki Gradle Usług Google w pliku Gradle projektu (na poziomie głównym) (build.gradle.kts) ścieżką klasy wtyczki Strict Version Matcher:

Przed

buildscript {
  dependencies {
    // ...

    classpath("com.google.gms:google-services:4.3.3")
  }
}

Po

buildscript {
  dependencies {
    // ...
    classpath("com.google.android.gms:strict-version-matcher-plugin:1.2.1")
  }
}

Usuń aplikację Firebase w konsoli Firebase zgodnie z instrukcjami na stronie pomocy Firebase.

Uzyskiwanie pomocy

Jeśli napotkasz jakieś problemy, zapoznaj się ze stroną społeczności , na której znajdziesz informacje o kanałach, za pomocą których możesz się z nami skontaktować.