Z tego przewodnika dowiesz się, jak przeprowadzić migrację z ML Kit for Firebase na Androida.
Aktualizowanie importów Gradle
Pakiet SDK ML Kit wymaga tylko 1 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. ML Kit używa przestrzeni nazw com.google.android.gms w przypadku bibliotek, które zależą od Usług Google Play.
Interfejsy Vision API
Modele połączone są dostarczane jako część aplikacji. Modele cienkie trzeba pobrać. Niektóre interfejsy API są dostępne w wersji połączonej i cienkiej, a inne tylko w jednej z nich:
| Interfejs API | Łączenie w pakiety | Cienka |
|---|---|---|
| Rozpoznawanie tekstu | x (beta) | x |
| Wykrywanie twarzy | x | x |
| Skanowanie kodów kreskowych | x | x |
| Dodawanie etykiet do obrazów | x | x |
| Wykrywanie i śledzenie obiektów | x | - |
Zaktualizuj zależności bibliotek ML Kit na Androida w pliku Gradle na poziomie modułu (aplikacji) (zwykle app/build.gradle.kts) zgodnie z tabelami poniżej:
Modele połączone
| Interfejs API | Stare artefakty | Nowy 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 |
Modele cienkie
| Interfejs API | Stare artefakty | Nowy 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 API | Stary artefakt | Nowy 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 je wczytywać za pomocą LocalModel.
Więcej informacji znajdziesz w przewodniku po migracji z Firebase ML do Cloud Storage. |
Interfejsy Natural Language API
Modele połączone są dostarczane jako część aplikacji. Modele cienkie trzeba pobrać:
| Interfejs API | Łączenie w pakiety | Cienka |
|---|---|---|
| Identyfikator języka | x | x |
| Inteligentna odpowiedź | x | x (beta) |
Zaktualizuj zależności bibliotek ML Kit na Androida w pliku Gradle na poziomie modułu (aplikacji) (zwykle app/build.gradle.kts) zgodnie z tabelami poniżej:
Modele połączone
| Interfejs API | Stare artefakty | Nowy 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 |
Modele cienkie
| Interfejs API | Stare artefakty | Nowy 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 zajęć
Jeśli Twoja klasa znajduje się w tej tabeli, wprowadź wskazaną zmianę:
| Stara klasa | Nowe 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 zostały wycofane. Więcej informacji 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 postępuj zgodnie z tymi regułami:
- Usuń prefiks
FirebaseVisionz nazwy klasy. - Usuń inne prefiksy, które zaczynają się od prefiksu
Firebasew nazwie klasy.
W nazwach pakietów zastąp też prefiks com.google.firebase.ml prefiksem com.google.mlkit.
Aktualizowanie nazw metod
Wymagane są minimalne zmiany w kodzie:
- Zmieniono sposób tworzenia instancji detektora, skanera, etykietowania, tłumacza itp. Każda funkcja ma teraz własny punkt wejścia. Na przykład:
BarcodeScanning,TextRecognition,ImageLabeling,Translation... Wywołania usługi FirebasegetInstance()są zastępowane wywołaniami metodygetClient()punktu wejścia funkcji. - Usunięto domyślne tworzenie instancji
TextRecognizer, 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 w alfabecie łacińskim, zadeklaruj zależność odcom.google.android.gms:play-services-mlkit-text-recognitioni użyjTextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS). - Usunięto domyślne tworzenie instancji
ImageLabeleriObjectDetector, ponieważ wprowadziliśmy obsługę modeli niestandardowych w przypadku tych 2 funkcji. Aby na przykład używać opcji domyślnych z modelem podstawowym wImageLabeling, zadeklaruj zależność odcom.google.mlkit:image-labelingi użyjImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)w Javie. - Wszystkie uchwyty (detektor, skaner, etykietowanie, tłumacz itp.) można zamknąć. Gdy
te obiekty nie będą już używane, wywołaj metodę
close(). Jeśli używasz ich wFragmentlubAppCompatActivity, możesz to zrobić, wywołującLifecycleOwner.getLifecycle()wFragmentlubAppCompatActivity, a następnie wywołującLifecycle.addObserver. - Aby zachować spójność, nazwy
processImage()idetectInImage()w interfejsach Vision API zostały zmienione naprocess(). - Interfejsy Natural Language API używają teraz terminu „tag języka” (zgodnie ze standardem BCP 47) zamiast „kodu języka”.
- Usunięto metody pobierania w klasach
xxxOptions. - Metoda
getBitmap()w klasieInputImage(zastępującaFirebaseVisionImage) nie jest już obsługiwana w ramach interfejsu publicznego. Aby uzyskać bitmapę przekonwertowaną z różnych danych wejściowych, zapoznaj się z plikiemBitmapUtils.javaw przykładowym projekcie ML Kit. - Usunięto
FirebaseVisionImageMetadata. Możesz po prostu przekazać metadane obrazu, takie jakwidth,height,rotationDegrees,format, do metod konstrukcyjnychInputImage.
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 Java:
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 interfejsu 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 „cienki” (zalecany) – zmniejsza rozmiar aplikacji, a model jest współdzielony między aplikacjami. Deweloperzy będą jednak musieli się upewnić, że model został pobrany przed pierwszym użyciem.
- W pliku APK aplikacji, czyli „połączony” – zwiększa rozmiar aplikacji, ale model jest od razu gotowy do użycia.
Te 2 implementacje różnią się nieco od siebie, a wersja „połączona” ma kilka ulepszeń w porównaniu z wersją „cienką”. Szczegółowe informacje o tych różnicach znajdziesz we wskazówkach dotyczących interfejsu Barcode Scanning API.
Wykrywanie twarzy
W przypadku interfejsu Face Detection API modele można dostarczać na 2 sposoby:
- Za pomocą Usług Google Play, czyli „cienki” (zalecany) – zmniejsza rozmiar aplikacji, a model jest współdzielony między aplikacjami. Deweloperzy będą jednak musieli się upewnić, że model został pobrany przed pierwszym użyciem.
- W pliku APK aplikacji, czyli „połączony” – zwiększa rozmiar pobierania aplikacji , ale model jest od razu gotowy do użycia.
Działanie tych implementacji jest takie samo.
Tłumaczenie
TranslateLanguageużywa teraz czytelnych nazw stałych (np.ENGLISH) zamiast tagów języka (EN). Są one też teraz@StringDef, zamiast@IntDef, a wartością stałej jest 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 używaj Cloud Storage do hostowania modeli i dodaj do aplikacji logikę pobierania, aby pobierać modele. Więcej informacji 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ą przybliżoną, pamiętaj, że nowy pakiet SDK zmienił sposób zwracania kategorii klasyfikacji wykrytych obiektów.
Kategoria klasyfikacji jest zwracana jako instancja DetectedObject.Label zamiast liczby całkowitej. Wszystkie możliwe kategorie klasyfikatora przybliżonego są zawarte w klasie PredefinedCategory.
Oto przykład starego i nowego kodu Kotlin:
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) { ... }
Usunięto kategorię „nieznane”. Gdy wiarygodność klasyfikacji obiektu jest niska, nie zwracamy żadnej etykiety.
Usuwanie zależności Firebase
Po migracji usuń zależności Firebase. Aby to zrobić:
- Usuń plik konfiguracyjny Firebase, usuwając plik konfiguracyjny
google-services.jsonw katalogu modułu (na poziomie aplikacji) aplikacji. - Zastąp wtyczkę Gradle Usług Google 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ę Firebase w konsoli Firebase zgodnie z instrukcjami na stronie pomocy Firebase.
Uzyskiwanie pomocy
Jeśli napotkasz jakieś problemy, zapoznaj się ze stroną społeczności , na której znajdziesz informacje o kanałach, za pomocą których możesz się z nami skontaktować.