Migracja na Androida

Z tego przewodnika dowiesz się, jak przejść z ML Kit na Firebase na Androida.

Aktualizowanie importów Gradle

Pakiet SDK ML Kit wymaga tylko jednej zależności dla każdego interfejsu API ML Kit. 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 pakietowe są dostarczane w ramach aplikacji. Modele cienkie muszą być pobrane. Niektóre interfejsy API są dostępne w wersji pakietowej i uproszczonej, 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 dla bibliotek ML Kit na Androida w pliku Gradle modułu (na poziomie aplikacji) (zwykle app/build.gradle.kts) zgodnie z tymi tabelami:

Modele łączone w pakiety

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 do aplikacji logikę pobierania, aby wczytywać je za pomocą LocalModel. Szczegółowe informacje znajdziesz w  przewodniku po migracji z Firebase ML do Cloud Storage.

Interfejsy Natural Language API

Modele pakietowe są dostarczane w ramach aplikacji. Modele cienkie muszą być pobrane:

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

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

Modele łączone w pakiety

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 pojawi 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. Szczegółowe informacje 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 zajęć.
  • Usuń z nazwy klasy inne prefiksy, które zaczynają się od prefiksu Firebase.

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

Aktualizowanie nazw metod

Wymaga to minimalnych zmian w kodzie:

  • Zmieniono instancję detektora, skanera, etykietowania lub tłumacza. 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.
  • Domyślna instancja dla TextRecognizer została usunięta, 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).
  • Domyślne tworzenie instancji dla ImageLabeler i ObjectDetector zostało usunięte, ponieważ wprowadziliśmy obsługę modeli niestandardowych w przypadku tych 2 funkcji. Aby na przykład użyć opcji domyślnych z modelem podstawowym w usłudze ImageLabeling, zadeklaruj zależność od com.google.mlkit:image-labeling i użyj ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) w Javie.
  • Wszystkie uchwyty (detektor, skaner, etykietujący, tłumacz...) można zamknąć. Upewnij się, że metoda close() jest wywoływana, gdy te obiekty nie będą już używane. Jeśli używasz ich w Fragmentlub AppCompatActivity, możesz to zrobić, wywołując funkcję call LifecycleOwner.getLifecycle() w Fragmentlub AppCompatActivity, a następnie wywołując funkcję Lifecycle.addObserver.
  • processImage() i detectInImage() w interfejsach Vision API zostały zmienione na process(), aby zachować spójność.
  • Interfejsy Natural Language API używają teraz terminu „tag języka” (zgodnie z standardem BCP 47) zamiast „kodu języka”.
  • Metody pobierania w klasach xxxOptions zostały usunięte.
  • Metoda getBitmap() w klasie InputImage (zastępująca FirebaseVisionImage) nie jest już obsługiwana w ramach interfejsu publicznego. Aby uzyskać mapę bitową przekonwertowaną z różnych danych wejściowych, zapoznaj się z BitmapUtils.java w przykładowym projekcie ML Kit.
  • FirebaseVisionImageMetadata został usunięty, 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 przykłady starych i nowych metod w Javie:

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 mogą być teraz dostarczane na 2 sposoby:

  • Za pomocą usług Google Play, czyli „cienki” (zalecany) – zmniejsza rozmiar aplikacji, a model jest współdzielony między aplikacjami. Deweloperzy muszą jednak zadbać o to, aby model został pobrany przed pierwszym użyciem.
  • Z plikiem APK aplikacji, czyli „w pakiecie” – zwiększa to rozmiar aplikacji, ale oznacza, że model jest od razu gotowy do użycia.

Te 2 implementacje nieco się od siebie różnią. Wersja „pakietowa” ma kilka ulepszeń w porównaniu z wersją „uproszczoną”. 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 mogą być dostarczane na 2 sposoby:

  • Za pomocą usług Google Play, czyli „cienki” (zalecany) – zmniejsza rozmiar aplikacji, a model jest współdzielony między aplikacjami. Deweloperzy muszą jednak zadbać o to, aby model został pobrany przed pierwszym użyciem.
  • Z plikiem APK aplikacji, czyli „w pakiecie” – zwiększa to rozmiar pobierania aplikacji, ale oznacza, że 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ęzyków (EN). Są one też teraz @StringDef zamiast @IntDef, a wartością stałej jest pasujący tag języka w standardzie 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. Do hostowania modeli należy używać Cloud Storage i dodać do aplikacji logikę pobierania, aby pobierać modele. Szczegółowe informacje znajdziesz w przewodniku po migracji z Firebase ML do Cloud Storage.

Wykrywanie i śledzenie obiektów

Jeśli Twoja aplikacja korzysta z wykrywania obiektów z grubym podziałem na kategorie, 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 zgrubnego są uwzględnione w klasie PredefinedCategory.

Oto przykład starego i nowego kodu w Kotlinie:

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 w Javie:

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

Kategoria „Nieznane” została usunięta. Gdy ufność klasyfikacji obiektu jest niska, nie zwracamy żadnej etykiety.

Usuwanie zależności Firebase

Po migracji usuń zależności Firebase. Wykonaj te czynności:

  • Usuń plik konfiguracyjny Firebase, usuwając plik konfiguracyjny google-services.json w katalogu modułu (na poziomie 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 jakiekolwiek problemy, zajrzyj na naszą stronę społeczności, gdzie znajdziesz informacje o kanałach, za pomocą których możesz się z nami skontaktować.