Migracja na Androida

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Aktualizowanie importu 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 w bibliotekach zależnych od Usług Google Play.

Interfejsy Vision API

Modele dołączone do aplikacji są dostarczane w ramach aplikacji. Modele cienkie należy pobrać. Niektóre interfejsy API są dostępne w obu tych formatach:

APIPołączonaCienka
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 pakietu ML Kit na Androida w module (na poziomie aplikacji) (zwykle jest to 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.0.2
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.5
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.7
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.0

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.1.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:18.0.2,

Edge Vision

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:16.0.0-beta4,
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:16.0.0-beta4
com.google.mlkit:linkfirebase:17.0.0

Interfejsy API Natural Language

Modele dołączone do aplikacji są dostarczane w ramach aplikacji. Wszystkie interfejsy API języków są dostarczane jako modele w pakiecie. Oto nowe nazwy artefaktów:

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

Zaktualizuj nazwy zajęć

Jeśli klasa jest widoczna w tej tabeli, wprowadź podaną zmianę:

Stara klasaNowa klasa
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.FirebaseAutoMLZdalneModel com.google.mlkit.common.model.CustomZdalneModel
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ęć postępuj zgodnie z tymi regułami:

  • Usuń prefiks FirebaseVision z nazwy klasy.
  • Usuń z nazwy klasy prefiksy zaczynające się od Firebase.

W nazwach pakietów prefiks com.google.firebase.ml zaczyna się od com.google.mlkit.

Zaktualizuj nazwy metod

Wprowadziliśmy drobne zmiany w kodzie:

  • Wzorzec do wykrywania treści, skanera, oznaczania etykietami i tłumaczem został zmieniony. Każda funkcja ma teraz własny punkt wejścia. Przykłady: BarcodeScanning, TextRecognition, ImageLabeling, Translation... Połączenia z usługą Firebase getInstance() są zastępowane wywołaniami metody getClient()punktu wejścia funkcji.
  • Usunięto domyślne wystąpienie funkcji TextRecognizer, 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 łacińskiego, zadeklaruj zależność w polu com.google.android.gms:play-services-mlkit-text-recognition i użyj właściwości TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • Usunięto domyślne instancję ImageLabeler i ObjectDetector, ponieważ wprowadziliśmy obsługę tych modeli niestandardowych. Aby na przykład używać opcji domyślnych z modelem podstawowym w narzędziu ImageLabeling, zadeklaruj zależność w polu com.google.mlkit:image-labeling i użyj właściwości ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) w języku Java.
  • Wszystkie uchwyty (wzorca do wykrywania treści, skanowania, oznaczania etykietami i tłumaczem) są zamknięte. Upewnij się, że metoda close() jest wywoływana, gdy te obiekty nie będą już używane. Jeśli korzystasz z fragmentów lub kodu AppCompatActivity, możesz w łatwy sposób to wywołać element LifecycleOwner.getLifecycle() w elemencie Fragment lub AppCompatActivity, a następnie wywołać funkcję Lifecycle.addObserver.
  • Aby zapewnić spójność, nazwy processImage() i detectInImage() w interfejsach Vision API zostały zmienione na process() .
  • Interfejsy Natural Language API używają teraz terminu „tag language” (zgodnie z definicją w standardzie BCP 47), a nie jako „kod języka”.
  • Metody getter w klasach xxxOptions zostały usunięte.
  • Metoda getBitmap() w klasie wejściowej ImageImage(zastępuje właściwość FirebaseVisionImage) nie jest już obsługiwana w interfejsie publicznym. Aby dowiedzieć się, jak przekonwertować bitmapę z różnych danych wejściowych, zapoznaj się z artykułem BitmapUtils.java w przykładzie krótkiego wprowadzenia ML Kit.
  • Usunięto FirebaseVisionImageMetadata. Wystarczy, że przekażesz metadane obrazu, np. szerokość, wysokość, rotację obrotu i formaty do metod tworzenia elementu ImageImages.

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

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

Nowy

// 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 Java:

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

Nowy

// 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ć teraz udostępniane na 2 sposoby:

  • W Usługach Google Play (odmiana „cienka” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest wspólny). Deweloperzy muszą jednak upewnić się, że model został pobrany, zanim po raz pierwszy użyje go.
  • Pakiet APK (w pakiecie) „pakiet” – zwiększa rozmiar aplikacji, ale oznacza, że model jest od razu gotowy do użycia.

Obie implementacje różnią się nieznacznie, a w wersji „w pakiecie” wprowadzono kilka ulepszeń w porównaniu z „cienkim”. Szczegółowe informacje na temat tych różnic znajdziesz w wytycznych dotyczących Barcode Scanning API.

Wykrywanie twarzy

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

  • W Usługach Google Play (odmiana „cienka” (zalecane) – zmniejsza to rozmiar aplikacji, a model jest wspólny). Deweloperzy muszą jednak upewnić się, że model został pobrany, zanim po raz pierwszy użyje go.
  • Pakiet APK (w pakiecie) „pakiet” – zwiększa rozmiar aplikacji do pobrania, 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). Obecnie są to teraz @StringDef zamiast @IntDef, a wartość stałej to pasujący tag języka BCP 47.

  • Jeśli Twoja aplikacja korzysta z opcji pobierania stanu „brak aktywności urządzenia”, pamiętaj, że została ona usunięta i nie można jej już używać. Nadal możesz korzystać z opcji ładowania urządzenia. Jeśli chcesz wykonać bardziej złożone działanie, możesz opóźnić wywołanie funkcji RemoteModelManager.download zgodnie z Twoją logiką.

Etykieta obrazu AutoML

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

Jeśli chcesz użyć bardziej złożonych rozwiązań, możesz opóźnić wywołanie funkcji RemoteModelManager.download zgodnie z Twoją logiką.

Wykrywanie i śledzenie obiektów

Jeśli Twoja aplikacja korzysta z wykrywania obiektów o przybliżonej klasyfikacji, pamiętaj, że nowy pakiet SDK zmienił sposób, w jaki zwraca klasyfikację wykrytych obiektów.

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

Oto przykład starego i nowego kodu Kotlina:

Stara wersja

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:

Stara wersja

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 „nieznana” została usunięta. Gdy poziom pewności klasyfikacji obiektu jest niski, nie zwracamy żadnej etykiety.

Usuwanie zależności Firebase (opcjonalnie)

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

  • Jest to jedyny komponent Firebase, którego używasz.
  • Używasz tylko interfejsów API na urządzeniu.
  • Nie korzystasz z modelowania.

W takim przypadku po migracji możesz usunąć zależności Firebase. Wykonaj te czynności:

  • Usuń plik konfiguracji Firebase, usuwając plik konfiguracyjny google-services.json z katalogu modułów (na poziomie aplikacji) aplikacji.
  • Zastąp wtyczkę Gradle usług Google (na poziomie aplikacji) w module (zwykle app/build.gradle) wtyczką ścisłego dopasowania do wersji:

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 Gradle wtyczki Google Services Gradle w swoim projekcie (na poziomie głównym) pliku Gradle (build.gradle) tą wtyczką wtyczki ścisłej wersji dopasowania:

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 instrukcjami dostępnymi w witrynie pomocy Firebase.

Jak uzyskać pomoc

Jeśli napotkasz problemy, odwiedź naszą stronę Społeczność, na której znajdziesz listę kanałów, w których możesz się z nami skontaktować.