Migracja na Androida

Aktualizowanie importów Gradle

Nowy pakiet SDK wymaga tylko 1 zależności dla każdego interfejsu ML Kit API. Nie musisz określać wspólnych bibliotek, takich jak firebase-ml-vision czy firebase-ml-natural-language. ML Kit używa przestrzeni nazw com.google.android.gms na potrzeby bibliotek zależnych od Usług Google Play.

Interfejsy API Vision

Modele z pakietu są dostarczane w ramach aplikacji. Trzeba pobrać cienkie modele. Niektóre interfejsy API są dostępne zarówno w pakietach, jak i w formie cienkiej, a inne tylko w jednej lub drugiej:

APIŁączenie w pakietyCienka
Rozpoznawanie tekstux (beta)x
Wykrywanie twarzyxx
Skanowanie kodów kreskowychxx
Oznaczanie obrazów etykietamixx
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), zgodnie z tymi tabelami:

Modele połączone

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.2.0
Konturowanie 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.6
Oznaczanie obrazów etykietami 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.8
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.1

Cienkie modele

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

AutoMLVision Edge

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.2
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.2
com.google.mlkit:linkfirebase:17.0.0

Interfejsy API Natural Language

Modele z pakietu są dostarczane w ramach aplikacji. Trzeba pobrać cienkie modele:

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), zgodnie z tymi tabelami:

Modele połączone

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.5
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.3

Cienkie modele

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

Zaktualizuj nazwy zajęć

Jeśli zajęcia pojawiają 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.CustomRemoteModel
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 zajęć przestrzegaj tych reguł:

  • Usuń prefiks FirebaseVision z nazwy zajęć.
  • Usuń z nazwy klasy inne prefiksy, które zaczynają się prefiksem Firebase.

Poza tym w nazwach pakietów zastąpisz prefiks com.google.firebase.ml ciągiem com.google.mlkit.

Zaktualizuj nazwy metod

Wprowadź nieznaczne zmiany w kodzie:

  • Wykrywacz/skaner/oznaczający/tłumacz... wystąpienia zostały zmienione. Każda z tych funkcji ma teraz własny punkt wejścia. Na przykład: skanowanie kodów kreskowych, rozpoznawanie tekstu, etykiety obrazów, tłumaczenie... Wywołania usługi Firebase getInstance() są zastępowane wywołaniami metody getClient()punktu wejścia funkcji.
  • Domyślna instancja narzędzia 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 w modelu rozpoznawania tekstu alfabetu łacińskiego, zadeklaruj zależność od com.google.android.gms:play-services-mlkit-text-recognition i użyj metody TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • Domyślne tworzenie instancji ImageLabeler i ObjectDetector zostało usunięte, 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 funkcji ImageLabeling, zadeklaruj zależność od com.google.mlkit:image-labeling i użyj elementu ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) w języku Java.
  • Można zamknąć wszystkie uchwyty (wykrywacz/skaner/oznaczanie etykietami/tłumacz...). Upewnij się, że metoda close() jest wywoływana, gdy te obiekty nie będą już używane. Jeśli używasz ich w elemencie Fragment lub AppCompatActivity, możesz to łatwo zrobić, używając wywołania LifecycleOwner.getLifecycle() z fragmentu lub AppCompatActivity, a potem wywołując Lifecycle.addObserver.
  • Aby zachować spójność, nazwa processImage() i detectInImage() w interfejsach Vision API została zmieniona na process() .
  • Interfejsy Natural Language API używają teraz terminu „tag języka” (zgodnie z definicją w standardzie BCP 47), a nie „kod języka”.
  • Metody pobierania z klas xxxOptions zostały usunięte.
  • Metoda getBitmap() w klasie wejściowej(zastępująca FirebaseVisionImage) nie jest już obsługiwana jako część interfejsu publicznego. Aby dowiedzieć się, jak przekonwertować mapę bitową z różnych danych wejściowych, zapoznaj się z BitmapUtils.java w przykładzie krótkiego wprowadzenia do pakietu ML Kit.
  • Usunięto metadane obrazu FirebaseVisionImageMetadata, dlatego możesz po prostu przekazać metadane obrazu, takie jak szerokość, wysokość, kierunek obrotów, format, do metod tworzenia elementu InternalImages.

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

Stara wersja

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

Nowi

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

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

Stara wersja

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

Nowi

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

Zmiany związane z interfejsem API

Skanowanie kodu kreskowego

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

  • Za pomocą Usług Google Play nazywanych „cienkim” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest współużytkowany przez aplikacje. Deweloperzy muszą jednak pobrać model, zanim będą go używać po raz pierwszy.
  • W przypadku pliku APK aplikacji nazywanego „pakietem” – rozmiar aplikacji zwiększa się, ale model jest od razu gotowy do użycia.

Te 2 implementacje nieco się różnią, a „pakiet” oferuje szereg ulepszeń w porównaniu z wersją „cieńką”. Szczegółowe informacje na temat tych różnic można znaleźć w wytycznych dotyczących Barcode Scanning API.

Wykrywanie twarzy

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

  • Za pomocą Usług Google Play nazywanych „cienkim” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest współużytkowany przez aplikacje. Deweloperzy muszą jednak pobrać model, zanim będą go używać po raz pierwszy.
  • W przypadku pliku APK aplikacji nazywanego „pakietem” – rozmiar aplikacji zwiększa się, ale model jest od razu gotowy do użycia.

Sposób działania implementacji jest taki sam.

Tłumaczenie

  • Wartością stałej TranslateLanguage są teraz czytelne nazwy (np. ENGLISH) zamiast tagów języka (EN). Obecnie są to @StringDef, a nie @IntDef. Wartością stałej jest pasujący tag języka BCP 47.

  • Jeśli Twoja aplikacja korzysta z opcji pobierania „Urządzenie bezczynne”, pamiętaj, że ta opcja została usunięta i nie można jej już używać. Nadal możesz korzystać z opcji ładowania urządzenia. Jeśli chcesz uzyskać bardziej złożone działanie, możesz opóźnić wywołanie metody RemoteModelManager.download, korzystając z własnych algorytmów.

Oznaczanie obrazów etykietami za pomocą AutoML

Jeśli Twoja aplikacja korzysta z opcji pobierania „Urządzenie bezczynne”, pamiętaj, że ta opcja została usunięta i nie można jej już używać. Nadal możesz korzystać z opcji ładowania urządzenia.

Jeśli chcesz uzyskać bardziej złożone działanie, możesz opóźnić wywołanie funkcji RemoteModelManager.download, które działają samodzielnie.

Wykrywanie i śledzenie obiektów

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

Kategoria klasyfikacji jest zwracana jako instancja DetectedObject.Label, a nie liczba całkowita. Wszystkie możliwe kategorie przybliżonego klasyfikatora są uwzględnione w klasie PredefinedCategory.

Oto przykład starego i nowego kodu Kotlin:

Stara wersja

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

Nowi

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:

Stara wersja

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

Nowi

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”. Gdy wiarygodność klasyfikacji obiektu jest niska, po prostu nie zwracamy żadnej etykiety.

Usuń zależności Firebase (opcjonalnie)

Ten krok ma zastosowanie tylko wtedy, gdy są spełnione te warunki:

  • Firebase ML Kit to jedyny komponent Firebase, z którego korzystasz.
  • Używasz tylko interfejsów API działających na urządzeniu.
  • Nie używasz udostępniania modelu.

W takim przypadku możesz usunąć zależności Firebase po zakończeniu migracji. Aby to zrobić:

  • Usuń plik konfiguracji Firebase, usuwając plik konfiguracyjny google-services.json znajdujący się w katalogu modułu (na poziomie aplikacji) swojej aplikacji.
  • Zastąp wtyczkę usług Google do obsługi Gradle w pliku Gradle modułu (na poziomie aplikacji) (zwykle app/build.gradle) wtyczką Strict Version Matcher:

Przed

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

android {
  // …
}

Po

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

android {
  // …
}
  • Zastąp ścieżkę klasy wtyczki usług Google do obsługi Gradle w pliku Gradle (build.gradle) w projekcie (na poziomie katalogu głównym) tą z wtyczki Strict Version Matcher:

Przed

buildscript {
  dependencies {
    // ...

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

Po

buildscript {
  dependencies {
    // ...

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

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

Jak uzyskać pomoc

Jeśli napotkasz jakieś problemy, zajrzyj na stronę Społeczność, gdzie znajdziesz informacje o kanałach, za pomocą których można się z nami skontaktować.