Migracja na Androida

Aktualizowanie importów Gradle

Nowy pakiet SDK wymaga tylko jednej 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 w przypadku bibliotek zależnych od Usług Google Play.

Interfejsy Vision API

Modele w pakiecie są dostarczane jako część aplikacji. Musisz pobrać cienkie modele. Niektóre interfejsy API są dostępne zarówno w formie pakietu, jak i w niepełnej postaci, a inne tylko w jednej lub innej postaci:

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

Modele w pakiecie

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
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.6
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.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 języka naturalnego

Modele w pakiecie są dostarczane jako część aplikacji. Musisz pobrać cienkie modele:

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

Modele w pakiecie

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 Twoje zajęcia znajdują 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 zajęć inne prefiksy zaczynające się od prefiksu Firebase.

Poza tym w nazwach pakietów zastąp com.google.firebase.ml prefiksem com.google.mlkit.

Zaktualizuj nazwy metod

W kodzie wprowadzono niewiele zmian:

  • Wykrywacz/skaner/etykieter/tłumacz... zmieniono wystąpienie. Każda funkcja 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 cech.
  • Domyślne wystąpienie narzędzia TextHandler zostało usunięte, 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 alfabetu łacińskiego, zadeklaruj zależność od kolumny com.google.android.gms:play-services-mlkit-text-recognition i użyj wartości TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • Domyślna instancja obiektów ImageLabeler i ObjectDetector została usunięta, ponieważ wprowadziliśmy obsługę tych 2 funkcji w modelach niestandardowych. Aby na przykład użyć opcji domyślnych z modelem podstawowym w ImageLabeling, zadeklaruj zależność od parametru com.google.mlkit:image-labeling i użyj wartości ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) w języku Java.
  • Wszystkie uchwyty (wykrywacz/skaner/etykieter/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 we fragmencie z fragmentem lub AppCompatActivity, możesz to zrobić w prosty sposób, używając metody LifecycleOwner.getLifecycle() we fragmencie lub AppCompatActivity, a następnie wybierając metodę Lifecycle.addObserver.
  • Nazwy processImage() i detectInImage() w interfejsach Vision API zostały zmienione na process() w celu zachowania spójności.
  • Interfejsy Natural Language API zamiast „kodu języka” używają teraz terminu „tag języka” (zgodnie ze standardem BCP 47).
  • Metody pobierania w klasach xxxOptions zostały usunięte.
  • Metoda getBitmap() w klasie wejściowej(zastępujące 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ładzie krótkiego wprowadzenia do pakietu ML Kit.
  • Metadane FirebaseVisionImageMetadata zostały usunięte. Do metod konstruowania obiektów wejściowych można przesyłać tylko metadane obrazu, takie jak szerokość, wysokość czy format obrotu.

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

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

Nowość

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

Nowość

// 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 dotyczące interfejsu API

Skanowanie kodów kreskowych

W przypadku interfejsu Barcode Scanning API modele mogą być dostarczane:

  • Za pomocą Usług Google Play lub „cienkich” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest wspólny dla wielu aplikacji. Deweloperzy muszą jednak pobrać model przed pierwszym użyciem.
  • W przypadku pliku APK aplikacji nazywanego „pakietem” – zwiększa to rozmiar aplikacji, ale oznacza, że z modelu można od razu korzystać.

Obie implementacje nieco się różnią, a wersja „w pakiecie” ma znacznie więcej ulepszeń niż wersja „cienka”. Szczegółowe informacje na temat tych różnic można znaleźć w wytycznych dotyczących interfejsu Barcode Scanning API.

Wykrywanie twarzy

W przypadku interfejsu Face Detection API modele mogą być dostarczane:

  • Za pomocą Usług Google Play lub „cienkich” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest wspólny dla wielu aplikacji. Deweloperzy muszą jednak pobrać model przed pierwszym użyciem.
  • W przypadku pliku APK aplikacji nazywanego „pakietem” – zwiększa to rozmiar pobieranej aplikacji, ale oznacza, że z modelu można od razu korzystać.

Sposób działania implementacji jest taki sam.

Tłumaczenie

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

  • Jeśli Twoja aplikacja korzysta z opcji pobierania „Bezczynne urządzenie”, 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 bardziej złożone zachowanie, możesz opóźnić wywołanie funkcji RemoteModelManager.download za pomocą własnej logiki.

Oznaczanie obrazów etykietami w AutoML

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

Jeśli chcesz bardziej złożone zachowanie, możesz opóźnić wywołanie funkcji RemoteModelManager.download za pomocą własnej logiki.

Wykrywanie i śledzenie obiektów

Jeśli Twoja aplikacja używa wykrywania obiektów z przybliżoną klasyfikacją, 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. Klasa PredefinedCategory obejmuje wszystkie możliwe kategorie klasyfikatora przybliżonego.

Oto przykład starego i nowego kodu Kotlin:

Stara wersja

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

Nowość

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:

Stara wersja

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

Nowość

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 poziom ufności klasyfikacji obiektu jest niski, po prostu nie zwracamy żadnej etykiety.

Usuń zależności Firebase (opcjonalnie)

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

  • Jedynym komponentem Firebase, którego używasz, jest Firebase ML Kit.
  • używasz tylko interfejsów API działających na urządzeniu;
  • Nie korzystasz z udostępniania modeli.

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

  • Usuń plik konfiguracji 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 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 do obsługi Gradle usług Google w pliku Gradle (build.gradle) projektu (na poziomie głównym) ścieżką dla 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 z konsoli Firebase zgodnie z instructions na stronie pomocy Firebase.

Jak uzyskać pomoc

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