Migracja na Androida

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

Aktualizowanie importów Gradle

Pakiet ML Kit SDK wymaga tylko jednej 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. Zestaw ML Kit używa przestrzeni nazw com.google.android.gms w przypadku bibliotek, które zależą od Usług Google Play.

Interfejsy API Vision

Modele dołączone są dostarczane jako część aplikacji. Modele Thin muszą zostać pobrane. Niektóre interfejsy API są dostępne zarówno w formie pakietu, jak i w formie uproszczonej, a inne tylko w jednej z tych form:

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 modułu (na poziomie aplikacji) (zwykle app/build.gradle.kts) zgodnie z tymi tabelami:

Modele w pakiecie

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

Cienkie modele

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.2

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

Interfejsy Natural Language API

Modele dołączone są dostarczane jako część aplikacji. Modele Thin muszą zostać pobrane:

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

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

Modele w pakiecie

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

Cienkie modele

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 klas

Jeśli Twoje zajęcia znajdują się w tej tabeli, wprowadź wskazaną zmianę:

Stare zajęciaNowe 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 są 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 obowiązują te zasady:

  • Usuń prefiks FirebaseVision z nazwy klasy.
  • 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.

Zaktualizuj nazwy metod

Wymaga to minimalnych zmian w kodzie:

  • Zmieniono instancję detektora/skanera/etykietowania/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ślne tworzenie instancji dla języka TextRecognizer zostało usunięte, ponieważ wprowadziliśmy dodatkowe biblioteki do rozpoznawania innych pism, takich jak chińskie i koreańskie. 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).
  • Usunęliśmy domyślne instancje dla ImageLabeler i ObjectDetector, ponieważ wprowadziliśmy obsługę modeli niestandardowych dla tych 2 funkcji. Aby na przykład użyć 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 języku Java.
  • Wszystkie uchwyty (detektor, skaner, etykietowanie, tłumacz itp.) 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 Fragment lub AppCompatActivity, możesz wywołać LifecycleOwner.getLifecycle() w Fragment lub AppCompatActivity, a następnie wywołać Lifecycle.addObserver.
  • W interfejsach Vision API zmieniono nazwy processImage() i detectInImage() na process(), aby zachować spójność.
  • Interfejsy Natural Language API używają teraz terminu „tag języka” (zgodnie z definicją w standardzie BCP 47) zamiast „kod języka”.
  • Metody pobierające 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 dowiedzieć się, jak przekonwertować bitmapę z różnych danych wejściowych, zapoznaj się z BitmapUtils.java w przykładowym krótkim wprowadzeniu do 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 Javy:

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 interfejsów 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 „thin” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest udostępniany między aplikacjami. Deweloperzy muszą jednak upewnić się, że model został pobrany, zanim użyją go po raz pierwszy.
  • Z plikiem APK aplikacji, czyli „w pakiecie” – zwiększa to rozmiar aplikacji, ale oznacza, że model jest od razu gotowy do użycia.

Obie implementacje nieco się różnią, przy czym wersja „pakietowa” ma kilka ulepszeń w porównaniu z wersją „podstawową”. Szczegółowe informacje o tych różnicach znajdziesz we wskazówkach dotyczących interfejsu Barcode Scanning API.

Wykrywanie twarzy

W przypadku interfejsu API wykrywania twarzy modele można dostarczać na 2 sposoby:

  • Za pomocą Usług Google Play, czyli „thin” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest udostępniany między aplikacjami. Deweloperzy muszą jednak upewnić się, że model został pobrany, zanim użyją go po raz pierwszy.
  • Z plikiem APK aplikacji, czyli „w pakiecie” – zwiększa to rozmiar pobieranej aplikacji, ale oznacza, że model jest od razu gotowy do użycia.

Działanie implementacji jest takie samo.

Tłumaczenie

  • TranslateLanguage używa teraz czytelnych nazw stałych (np. ENGLISH) zamiast tagów języka (EN). Są one teraz typu @StringDef, a nie @IntDef, a wartość stałej to 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 do hostowania modeli używaj Cloud Storage i dodaj 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 używa wykrywania obiektów z klasyfikacją ogólną, pamiętaj, że nowy pakiet SDK zmienił sposób zwracania kategorii klasyfikacji wykrytych obiektów.

Kategoria klasyfikacji jest zwracana jako instancja DetectedObject.Label, a nie liczba całkowita. Wszystkie możliwe kategorie klasyfikatora ogólnego 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 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) {
    ...
}

Kategoria „Nieznany” została usunięta. Jeśli pewność 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 konfiguracji Firebase, usuwając plik konfiguracji google-services.json z katalogu modułu (na poziomie aplikacji) aplikacji.
  • Zastąp wtyczkę Google Services Gradle 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ę w Firebase w konsoli Firebase zgodnie z instrukcjami na stronie pomocy Firebase.

Uzyskiwanie pomocy

Jeśli napotkasz jakiekolwiek problemy, odwiedź naszą stronę społeczności, na której znajdziesz informacje o dostępnych kanałach kontaktu z nami.