Migrazione per Android

Aggiorna importazioni Gradle

Il nuovo SDK richiede solo una dipendenza per ogni API ML Kit. Non è necessario specificare librerie comuni come firebase-ml-vision o firebase-ml-natural-language. ML Kit utilizza lo spazio dei nomi com.google.android.gms per le librerie che dipendono da Google Play Services.

API Vision

I modelli in bundle vengono distribuiti come parte della tua applicazione. I modelli sottili devono essere scaricati. Alcune API sono disponibili sia in bundle che in formato thin, altre solo in una forma o nell'altra:

APIIn bundleSottile
Riconoscimento del testox (beta)x
Rilevamento faccialexx
Scansione di codici a barrexx
Etichettatura delle immaginixx
Rilevamento e monitoraggio degli oggettix-

Aggiorna le dipendenze per le librerie Android ML Kit nel file Gradle del modulo (a livello di app) (di solito app/build.gradle) in base alle seguenti tabelle:

Modelli in bundle

APIVecchi artefattiNuovo artefatto
Scansione di codici a barre 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
Contorno viso 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
Etichettatura delle immagini 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
Rilevamento di oggetti 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

Modelli sottili

APIVecchi artefattiNuovo artefatto
Scansione di codici a barre com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0
Rilevamento facciale com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-face-detection:17.1.0
Riconoscimento del testo com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-text-recognition:19.0.0

AutoMLVision Edge

APIVecchio artefattoNuovo artefatto
AutoML senza scaricare 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 con download 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

API Natural Language

I modelli in bundle vengono distribuiti come parte della tua applicazione. I modelli sottili devono essere scaricati:

APIIn bundleSottile
ID linguaxx
Risposta rapidaxx (beta)

Aggiorna le dipendenze per le librerie Android ML Kit nel file Gradle del modulo (a livello di app) (di solito app/build.gradle) in base alle seguenti tabelle:

Modelli in bundle

APIVecchi artefattiNuovo artefatto
ID lingua 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
Risposta rapida 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

Modelli sottili

APIVecchi artefattiNuovo artefatto
ID lingua 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
Risposta rapida 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

Aggiorna i nomi dei corsi

Se il tuo corso viene visualizzato in questa tabella, apporta la modifica indicata:

Corso precedenteNuovo corso
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

Per gli altri corsi, segui queste regole:

  • Rimuovi il prefisso FirebaseVision dal nome della classe.
  • Rimuovi dal nome della classe gli altri prefissi che iniziano con il prefisso Firebase.

Inoltre, nei nomi dei pacchetti sostituisci il prefisso com.google.firebase.ml con com.google.mlkit.

Aggiorna i nomi dei metodi

Sono state apportate modifiche minime al codice:

  • L'istanza di rilevamento/scanner/etichettatore/traduttore... è stata modificata. Ogni funzionalità ora ha il proprio punto di ingresso. Ad esempio: BarcodeScanning, TextRecognition, ImageLabeling, Translation.... Le chiamate al servizio Firebase getInstance() vengono sostituite da chiamate al metodo del punto di ingresso della funzionalitàgetClient().
  • L'istanza predefinita per TextRiconoscimento è stata rimossa, in quanto abbiamo introdotto librerie aggiuntive per il riconoscimento di altri script come il cinese e il coreano. Per utilizzare le opzioni predefinite con il modello di riconoscimento del testo in caratteri latini, dichiara una dipendenza su com.google.android.gms:play-services-mlkit-text-recognition e usa TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • L'istanza predefinita per ImageLabeler e ObjectDetector è stata rimossa, poiché abbiamo introdotto il supporto dei modelli personalizzati per queste due funzionalità. Ad esempio, per utilizzare le opzioni predefinite con il modello di base in ImageLabeling, dichiara una dipendenza su com.google.mlkit:image-labeling e usa ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) in Java.
  • Tutti gli handle (rilevatore/scanner/etichettatore/traduttore...) possono essere chiusi. Assicurati che il metodo close() venga chiamato quando questi oggetti non verranno più utilizzati. Se li utilizzi in un frammento o in AppCompatActivity, un modo semplice per farlo è chiamare LifecycleOwner.getLifecycle() nel Fragment o AppCompatActivity e poi chiama Lifecycle.addObserver.
  • processImage() e detectInImage() nelle API Vision sono stati rinominati in process() per coerenza.
  • Le API Natural Language ora utilizzano il termine "tag language" (come definito dallo standard BCP 47) anziché "codice lingua".
  • I metodi getter nelle classi xxxOptions sono stati rimossi.
  • Il metodo getBitmap() nella classe InputImage(sostituendo FirebaseVisionImage) non è più supportato dall'interfaccia pubblica. Consulta BitmapUtils.java nell'esempio della guida rapida di ML Kit per ottenere la conversione del bitmap da vari input.
  • FirebaseVisionImageMetadata è stato rimosso, puoi semplicemente trasferire metadati dell'immagine come larghezza, altezza, rotazioneDegrees e formato ai metodi di creazione di InputImages.

Ecco alcuni esempi di metodi Kotlin vecchi e nuovi:

Precedenti

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

Novità

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

Ecco alcuni esempi di metodi Java vecchi e nuovi:

Precedenti

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

Novità

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

Modifiche specifiche per l'API

Scansione dei codici a barre

Per l'API Barcode Scanning, ora esistono due modi per distribuire i modelli:

  • Tramite Google Play Services, anche noto come "thin" (opzione consigliata), riduce le dimensioni dell'app e il modello viene condiviso tra le applicazioni. Tuttavia, gli sviluppatori dovranno assicurarsi che il modello venga scaricato prima di utilizzarlo per la prima volta.
  • Con l'APK dell'app, anche noto come "in bundle", aumentano le dimensioni dell'app, ma il modello è utilizzabile immediatamente.

Le due implementazioni sono leggermente diverse, poiché la versione "in bundle" presenta una serie di miglioramenti rispetto alla versione "sottile". Per informazioni dettagliate su queste differenze, consulta le linee guida dell'API Barcode Scanning.

Rilevamento facciale

Per l'API Face Detection, i modelli possono essere forniti in due modi:

  • Tramite Google Play Services, anche noto come "thin" (opzione consigliata), riduce le dimensioni dell'app e il modello viene condiviso tra le applicazioni. Tuttavia, gli sviluppatori dovranno assicurarsi che il modello venga scaricato prima di utilizzarlo per la prima volta.
  • Con l'APK dell'app, anche noto come "in bundle", aumentano le dimensioni di download dell'app, ma il modello è utilizzabile immediatamente.

Il comportamento delle implementazioni è lo stesso.

Traduzioni

  • Ora TranslateLanguage utilizza nomi leggibili per le sue costanti (ad es. ENGLISH) anziché tag di lingua (EN). Questi tag ora sono anche @StringDef, anziché @IntDef, e il valore della costante è il tag di lingua BCP 47 corrispondente.

  • Se la tua app utilizza l'opzione per la condizione di download "Dispositivo inattivo", tieni presente che questa opzione è stata rimossa e non può più essere utilizzata. Puoi comunque utilizzare l'opzione "ricarica del dispositivo". Se vuoi un comportamento più complesso, puoi ritardare la chiamata a RemoteModelManager.download secondo la tua logica.

Etichettatura immagini AutoML

Se la tua app utilizza l'opzione della condizione di download "Dispositivo inattivo", tieni presente che questa opzione è stata rimossa e non può più essere utilizzata. Puoi comunque utilizzare l'opzione "ricarica del dispositivo".

Se vuoi un comportamento più complesso, puoi ritardare la chiamata a RemoteModelManager.download secondo la tua logica.

Rilevamento e monitoraggio di oggetti

Se la tua app utilizza il rilevamento degli oggetti con una classificazione approssimativa, tieni presente che il nuovo SDK ha cambiato il modo in cui restituisce la categoria di classificazione per gli oggetti rilevati.

La categoria di classificazione viene restituita come istanza di DetectedObject.Label anziché come numero intero. Tutte le categorie possibili per il classificatore approssimativo sono incluse nella classe PredefinedCategory.

Ecco un esempio del vecchio e del nuovo codice Kotlin:

Precedenti

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

Novità

if (!object.labels.isEmpty() && object.labels[0].text == PredefinedCategory.FOOD) {
    ...
}
// or
if (!object.labels.isEmpty() && object.labels[0].index == PredefinedCategory.FOOD_INDEX) {
    ...
}

Ecco un esempio del codice Java precedente e di quello nuovo:

Precedenti

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

Novità

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) {
    ...
}

La categoria "sconosciuto" è stata rimossa. Quando la confidenza della classificazione di un oggetto è bassa, non viene restituita alcuna etichetta.

(Facoltativo) Rimuovi le dipendenze Firebase

Questo passaggio si applica solo quando le seguenti condizioni sono soddisfatte:

  • Firebase ML Kit è l'unico componente Firebase che utilizzi.
  • Devi usare solo API on-device.
  • Non utilizzi la pubblicazione del modello.

In questo caso, puoi rimuovere le dipendenze di Firebase dopo la migrazione. Segui questi passaggi:

  • Rimuovi il file di configurazione di Firebase eliminando il file di configurazione google-services.json nella directory del modulo (a livello di app) della tua app.
  • Sostituisci il plug-in Gradle dei servizi Google nel file Gradle del modulo (a livello di app) (di solito app/build.gradle) con il plug-in Strict Version Matcher:

Prima

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

android {
  // …
}

Dopo

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

android {
  // …
}
  • Sostituisci il classpath del plug-in Gradle dei servizi Google nel file Gradle del progetto (a livello di root) (build.gradle) con quello relativo al plug-in Strict Version Matcher:

Prima

buildscript {
  dependencies {
    // ...

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

Dopo

buildscript {
  dependencies {
    // ...

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

Elimina l'app Firebase nella console Firebase seguendo le instructions sul sito di assistenza di Firebase.

Richiedere assistenza

Se riscontri problemi, consulta la pagina della community dove sono illustrati i canali disponibili per metterti in contatto con noi.