Migración para Android

Actualiza las importaciones de Gradle

El nuevo SDK solo requiere una dependencia para cada API del ML Kit. No es necesario especificar bibliotecas comunes, como firebase-ml-vision o firebase-ml-natural-language. El Kit de AA usa el espacio de nombres com.google.android.gms para las bibliotecas que dependen de los Servicios de Google Play.

APIs de Vision

Los modelos empaquetados se entregan como parte de tu aplicación. Se deben descargar los modelos delgados. Algunas APIs están disponibles en formato pequeño y empaquetado, y otras solo en una forma u otra:

APIRed de Búsqueda y Red de DisplayFino
Reconocimiento de textox (beta)x
Detección de rostroxx
Escaneo de códigos de barrasxx
Etiquetado de imágenesxx
Detección y seguimiento de objetosx-

Actualiza las dependencias para las bibliotecas de Android del Kit de AA en el archivo Gradle (generalmente app/build.gradle) de tu módulo (a nivel de la app) de acuerdo con las siguientes tablas:

Modelos empaquetados

APIArtefactos antiguosNuevo artefacto
Escaneo de códigos de barras 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 del rostro 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
Etiquetado de imágenes 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
Detección de objetos 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

Modelos delgados

APIArtefactos antiguosNuevo artefacto
Escaneo de códigos de barras com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0
Detección de rostro com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-face-detection:17.1.0
Reconocimiento de texto com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-text-recognition:19.0.0

AutoMLVision Edge

APIArtefacto anteriorNuevo artefacto
AutoML sin descargar 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 descarga 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

APIs de Natural Language

Los modelos empaquetados se entregan como parte de tu aplicación. Los modelos delgados se deben descargar:

APIRed de Búsqueda y Red de DisplayFino
ID de idiomaxx
Respuesta inteligentexx (beta)

Actualiza las dependencias para las bibliotecas de Android del Kit de AA en el archivo Gradle (generalmente app/build.gradle) de tu módulo (a nivel de la app) de acuerdo con las siguientes tablas:

Modelos empaquetados

APIArtefactos antiguosNuevo artefacto
ID de idioma 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
Respuesta inteligente 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

Modelos delgados

APIArtefactos antiguosNuevo artefacto
ID de idioma 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
Respuesta inteligente 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

Actualiza los nombres de las clases

Si tu clase aparece en esta tabla, realiza el cambio indicado:

Clase anteriorClase nueva
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

Para otras clases, sigue estas reglas:

  • Quita el prefijo FirebaseVision del nombre de la clase.
  • Quita los otros prefijos que comiencen con el prefijo Firebase del nombre de la clase.

Además, en los nombres de paquetes, reemplaza el prefijo com.google.firebase.ml por com.google.mlkit.

Actualiza los nombres de los métodos

Los cambios de código son mínimos:

  • Se cambió la instancia de detector/escáner/etiquetador/traductor... Cada función ahora tiene su propio punto de entrada. Por ejemplo: BarcodeScanning, TextRecognition, ImageLabeling, Translation.... Las llamadas al servicio getInstance() de Firebase se reemplazan por llamadas al método getClient()del punto de entrada del atributo.
  • Se eliminó la creación de instancias predeterminada para TextRecognizer, ya que introdujimos bibliotecas adicionales para reconocer otras secuencias de comandos, como el chino y el coreano. Para usar opciones predeterminadas con el modelo de reconocimiento de texto de alfabeto latino, declara una dependencia en com.google.android.gms:play-services-mlkit-text-recognition y usa TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • Se quitó la creación de instancias predeterminada para ImageLabeler y ObjectDetector, desde que presentamos la compatibilidad con modelos personalizados para estos dos atributos. Por ejemplo, para usar las opciones predeterminadas con el modelo base en ImageLabeling, declara una dependencia en com.google.mlkit:image-labeling y usa ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) en Java.
  • Todos los controladores (detector/escáner/etiquetador/traductor...) se pueden cerrar. Asegúrate de que se llame al método close() cuando ya no se usen esos objetos. Si los usas en un Fragment o AppCompatActivity, una manera fácil de hacerlo es llamar a LifecycleOwner.getLifecycle() en Fragment o AppCompatActivity y, luego, llama a Lifecycle.addObserver.
  • Se cambió el nombre de processImage() y detectInImage() en las APIs de Vision a process() para mayor coherencia.
  • Las APIs de Natural Language ahora usan el término “etiqueta de idioma” (como se define en el estándar BCP 47) en lugar de “código de idioma”.
  • Se quitaron los métodos get de las clases xxxOptions.
  • Ya no se admite el método getBitmap() en la clase InputImage(reemplaza FirebaseVisionImage) como parte de la interfaz pública. Consulta BitmapUtils.java en la muestra de inicio rápido del Kit de AA para convertir un mapa de bits a partir de varias entradas.
  • Se quitó detectImageMetadata, y solo puedes pasar metadatos de imagen, como ancho, alto, rotaciónDegrees y format, en los métodos de construcción de InputImages.

Estos son algunos ejemplos de métodos de Kotlin antiguos y nuevos:

Antiguo

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

Nuevo

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

Estos son algunos ejemplos de métodos de Java antiguos y nuevos:

Antiguo

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

Nuevo

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

Cambios específicos de la API

Escaneo de códigos de barras

Para la API de Barcode Scanning, ahora hay dos formas en las que se pueden entregar los modelos:

  • A través de los Servicios de Google Play, también conocidos como “delgados” (recomendado), se reduce el tamaño de las apps y el modelo se comparte entre ellas. Sin embargo, los desarrolladores deberán asegurarse de descargar el modelo antes de usarlo por primera vez.
  • Con el APK de tu app, también conocido como "en paquete", aumenta el tamaño de la app, pero significa que el modelo se puede usar de inmediato.

Las dos implementaciones son ligeramente diferentes y la versión “empaquetada” tiene varias mejoras con respecto a la versión “delgada”. Puedes encontrar información sobre estas diferencias en los lineamientos de la API de Barcode Scanning.

Detección de rostro

Para la API de Face Detection, hay dos formas en que se pueden entregar los modelos:

  • A través de los Servicios de Google Play, también conocidos como “delgados” (recomendado), se reduce el tamaño de las apps y el modelo se comparte entre ellas. Sin embargo, los desarrolladores deberán asegurarse de descargar el modelo antes de usarlo por primera vez.
  • Con el APK de tu app, también conocido como "en paquete", aumenta el tamaño de descarga de la app, pero significa que el modelo se puede usar de inmediato.

El comportamiento de las implementaciones es el mismo.

Translation

  • TranslateLanguage ahora usa nombres legibles para sus constantes (p.ej., ENGLISH) en lugar de etiquetas de idioma (EN). Ahora también son @StringDef, en lugar de @IntDef, y el valor de la constante es la etiqueta de idioma BCP 47 coincidente.

  • Si tu app usa la opción de condición de descarga "dispositivo inactivo", ten en cuenta que esta opción se quitó y ya no se puede usar. Puedes seguir usando la opción "Carga del dispositivo". Si deseas un comportamiento más complejo, puedes retrasar la llamada a RemoteModelManager.download detrás de tu propia lógica.

Etiquetado de imágenes de AutoML

Si tu app usa la opción de condición de descarga "dispositivo inactivo", ten en cuenta que esta opción se quitó y ya no se puede usar. Puedes seguir usando la opción "Carga del dispositivo".

Si deseas un comportamiento más complejo, puedes retrasar la llamada a RemoteModelManager.download detrás de tu propia lógica.

Detección y seguimiento de objetos

Si tu app usa la detección de objetos con clasificación general, ten en cuenta que el nuevo SDK cambió la forma en que muestra la categoría de clasificación para los objetos detectados.

La categoría de clasificación se muestra como una instancia de DetectedObject.Label en lugar de un número entero. Todas las categorías posibles para el clasificador general se incluyen en la clase PredefinedCategory.

Este es un ejemplo del código Kotlin antiguo y el nuevo:

Antiguo

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

Nuevo

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

A continuación, se muestra un ejemplo del código Java antiguo y del nuevo:

Antiguo

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

Nuevo

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

Se eliminó la categoría "Desconocido". Cuando la confianza de la clasificación de un objeto es baja, simplemente no devolvemos ninguna etiqueta.

Quita las dependencias de Firebase (opcional)

Este paso solo se aplica cuando se cumplen estas condiciones:

  • El ML Kit de Firebase es el único componente de Firebase que usas.
  • Solo usas APIs integradas en el dispositivo.
  • No usas la entrega del modelo.

Si este es el caso, puedes quitar las dependencias de Firebase después de la migración. Lleve a cabo los pasos siguientes:

  • Para quitar el archivo de configuración de Firebase, borra el archivo de configuración google-services.json en el directorio del módulo (nivel de app) de tu app.
  • Reemplaza el complemento Gradle de los servicios de Google en el archivo Gradle (generalmente app/build.gradle) de tu módulo (nivel de app) por el complemento Strict Version Matcher:

Antes

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

android {
  // …
}

Después

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

android {
  // …
}
  • Reemplaza la ruta de clase del complemento de Gradle de los servicios de Google en el archivo Gradle (build.gradle) de tu proyecto (nivel de raíz) por la del complemento Strict Version Matcher:

Antes

buildscript {
  dependencies {
    // ...

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

Después

buildscript {
  dependencies {
    // ...

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

Borra tu app de Firebase en Firebase console según las instructions que se indican en el sitio de asistencia de Firebase.

Cómo obtener ayuda

Si tienes algún problema, consulta la página de la Comunidad, en la que detallamos los canales disponibles para comunicarte con nosotros.