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ć typowe biblioteki, takie jak firebase-ml-vision lub 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 niewielkiej wersji, a inne tylko w jednej postaci lub inny:

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 module (aplikacja poziomu) pliku Gradle (zwykle app/build.gradle) 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.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
com.google.mlkit:linkfirebase:17.0.0

Interfejsy API języka naturalnego

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

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

Zaktualizuj zależności bibliotek ML Kit na Androida w module (aplikacja poziomu) pliku Gradle (zwykle app/build.gradle) 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

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.

Oprócz tego w nazwach pakietów zastąp com.google.firebase.ml dzięki 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

  • TranslateLanguage używa teraz czytelnych nazw dla swoich stałych (np. ENGLISH) zamiast tagów języka (EN). To teraz @StringDef zamiast @IntDef, 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 „Urządzenie bezczynne”, pamiętaj, że może to spowodować Opcja została usunięta i nie można jej już używać. Nadal możesz korzystać z „Ładowanie urządzenia”.

Jeśli chcesz bardziej złożonego zachowania, możesz opóźnić połączenie RemoteModelManager.download za Twoją własną logiką.

Wykrywanie i śledzenie obiektów

Jeśli Twoja aplikacja używa wykrywania obiektów z przybliżoną klasyfikacją, pamiętaj, że funkcja nowy pakiet SDK zmienił sposób zwracania kategorii klasyfikacji wykrytej obiektów.

Kategoria klasyfikacji jest zwracana jako instancja DetectedObject.Label zamiast liczby całkowitej. Wszystkie możliwe kategorie dla Klasyfikator przybliżony jest uwzględniony w klasie PredefinedCategory.

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 projektu (na poziomie głównym) (build.gradle) ś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 instrukcje znajdziesz na stronie pomocy Firebase.

Uzyskiwanie pomocy

Jeśli napotkasz jakieś problemy, odwiedź naszą stronę Społeczności, gdzie znajdziesz wskazówki i opisy. kanały, za pomocą których można się z nami skontaktować.