Migração para o Android

Atualizar importações do Gradle

O novo SDK requer apenas uma dependência para cada API do Kit de ML. Você não precisa especificar bibliotecas comuns, como firebase-ml-vision ou firebase-ml-natural-language. O Kit de ML usa o namespace com.google.android.gms para bibliotecas que dependem do Google Play Services.

APIs do Vision

Os modelos em pacotes são enviados como parte do aplicativo. É necessário fazer o download dos modelos finos. Algumas APIs estão disponíveis nas formas agrupadas e superficial, outras apenas de uma forma ou outra:

APIAgrupadasFina
Reconhecimento de textox (Beta)x
Detecção facialxx
Leitura de código de barrasxx
Marcação de imagensxx
Detecção e rastreamento de objetosx-

Atualize as dependências das bibliotecas do Android do Kit de ML no arquivo Gradle do módulo (nível do app), que geralmente é app/build.gradle, de acordo com as seguintes tabelas:

Modelos em pacote

APIArtefatos antigosNovo artefato
Leitura de código 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 do rosto 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
Marcação de imagens 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
Detecção 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 finos

APIArtefatos antigosNovo artefato
Leitura de código de barras com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0
Detecção facial com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-face-detection:17.1.0
Reconhecimento 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

APIArtefato antigoNovo artefato
AutoML sem fazer 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
AutoML com 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

APIs de linguagem natural

Os modelos em pacotes são enviados como parte do aplicativo. É preciso fazer o download dos modelos finos:

APIAgrupadasFina
ID do idiomaxx
Resposta inteligentexx (Beta)

Atualize as dependências das bibliotecas do Android do Kit de ML no arquivo Gradle do módulo (nível do app), que geralmente é app/build.gradle, de acordo com as seguintes tabelas:

Modelos em pacote

APIArtefatos antigosNovo artefato
ID do 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
Resposta 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 finos

APIArtefatos antigosNovo artefato
ID do 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
Resposta 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

Atualizar nomes de turmas

Caso sua turma apareça nesta tabela, faça a alteração indicada:

Classe antigaNova turma
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 outras classes, siga estas regras:

  • Remova o prefixo FirebaseVision do nome da classe.
  • Remova outros prefixos que começam com Firebase do nome da classe.

Além disso, nos nomes dos pacotes, substitua o prefixo com.google.firebase.ml por com.google.mlkit.

Atualizar nomes de métodos

Há mudanças mínimas no código:

  • Detector/scanner/labeler/translator... A instanciação foi alterada. Agora cada recurso tem o próprio ponto de entrada. Por exemplo: BarcodeScanning, TextRecognition, ImageLabeling, Translation... As chamadas ao serviço getInstance() do Firebase são substituídas por chamadas ao método getClient() do ponto de entrada do recurso.
  • A instanciação padrão de TextRecognitionr foi removida, desde que introduzimos bibliotecas adicionais para reconhecer outros scripts, como chinês e coreano. Para usar as opções padrão com o modelo de reconhecimento de texto em script latino, declare uma dependência em com.google.android.gms:play-services-mlkit-text-recognition e use TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • A instanciação padrão de ImageLabeler e ObjectDetector foi removida, já que introduzimos suporte a modelos personalizados para esses dois atributos. Por exemplo, para usar as opções padrão com o modelo base no ImageLabeling, declare uma dependência em com.google.mlkit:image-labeling e use ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) em Java.
  • Todos os identificadores (detector/scanner/rotulador/tradutor...) podem ser fechados. O método close() precisa ser chamado quando esses objetos não forem mais usados. Se você os estiver usando em um Fragment ou AppCompatActivity, uma maneira fácil de fazer isso é chamar LifecycleOwner.getLifecycle() no Fragment ou AppCompatActivity e chamar Lifecycle.addObserver.
  • processImage() e detectInImage() nas APIs Vision foram renomeados como process() para manter a consistência.
  • As APIs Natural Language agora usam o termo "tag de idioma" (conforme definido pelo padrão BCP 47, em inglês) em vez de "código do idioma".
  • Os métodos getter em classes xxxOptions foram removidos.
  • O método getBitmap() na classe InputImage(substituindo FirebaseVisionImage) não é mais compatível como parte da interface pública. Consulte BitmapUtils.java na amostra do guia de início rápido do Kit de ML para converter o bitmap de várias entradas.
  • detectImageMetadata foi removido, basta transmitir metadados de imagens, como largura, altura, rotaçãoGraus, nos métodos de construção de InputImages.

Confira alguns exemplos de métodos Kotlin antigos e novos:

Antigo

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

Novo

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

Aqui estão alguns exemplos de métodos Java antigos e novos:

Antigo

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

Novo

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

Mudanças específicas da API

Leitura de código de barras

Para a API Barcode Scanning, agora existem duas maneiras de enviar os modelos:

  • Pelo Google Play Services, também conhecido como "fino" (recomendado): reduz o tamanho do app, e o modelo é compartilhado entre aplicativos. No entanto, os desenvolvedores precisarão garantir que o modelo seja transferido por download antes de usá-lo pela primeira vez.
  • Com o APK do seu app, também conhecido como "pacote": isso aumenta o tamanho do app, mas significa que o modelo pode ser usado imediatamente.

As duas implementações são um pouco diferentes, e a versão "agrupada" apresenta várias melhorias em relação à versão "fina". Detalhes sobre essas diferenças podem ser encontrados nas diretrizes da API Barcode Scanning.

Detecção facial

Para a API Face Detection, os modelos podem ser enviados de duas maneiras:

  • Pelo Google Play Services, também conhecido como "fino" (recomendado): reduz o tamanho do app, e o modelo é compartilhado entre aplicativos. No entanto, os desenvolvedores precisarão garantir que o modelo seja transferido por download antes de usá-lo pela primeira vez.
  • Com o APK do seu app, também conhecido como "pacote": isso aumenta o tamanho de download do app, mas significa que o modelo pode ser usado imediatamente.

O comportamento das implementações é o mesmo.

Tradução

  • TranslateLanguage agora usa nomes legíveis para suas constantes (por exemplo, ENGLISH) em vez de tags de idioma (EN). Elas também são agora @StringDef, em vez de @IntDef, e o valor da constante é a tag de idioma BCP 47 correspondente

  • Se o aplicativo usa a opção de condição de download “dispositivo ocioso”, saiba que ela foi removida e não pode mais ser usada. Você ainda pode usar a opção "Carregamento do dispositivo". Se você quiser um comportamento mais complexo, atrase a chamada de RemoteModelManager.download usando sua própria lógica.

Rotulagem de imagens do AutoML

Se o app usa a opção de condição de download "dispositivo inativo", ela foi removida e não pode mais ser usada. Você ainda pode usar a opção "Carregamento do dispositivo".

Se você quiser um comportamento mais complexo, é possível atrasar a chamada de RemoteModelManager.download por trás da sua própria lógica.

Detecção e rastreamento de objetos

Se o app usa a detecção de objetos com classificação abrangente, saiba que o novo SDK mudou a forma como retorna a categoria de classificação dos objetos detectados.

A categoria de classificação é retornada como uma instância de DetectedObject.Label em vez de um número inteiro. Todas as categorias possíveis do classificador aproximado estão incluídas na classe PredefinedCategory.

Confira um exemplo do código Kotlin antigo e novo:

Antigo

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

Novo

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

Aqui está um exemplo do código Java antigo e novo:

Antigo

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

Novo

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

A categoria "desconhecida" foi removida. Quando a confiança da classificação de um objeto é baixa, simplesmente não retornamos nenhum rótulo.

Remover dependências do Firebase (opcional)

Esta etapa só se aplica quando estas condições são atendidas:

  • O Kit de ML do Firebase é o único componente do Firebase que você usa.
  • Você usa apenas APIs no dispositivo.
  • Você não usa a disponibilização de modelos.

Nesse caso, remova as dependências do Firebase após a migração. Siga estas etapas:

  • Remova o arquivo de configuração do Firebase excluindo o arquivo de configuração google-services.json no diretório do módulo (nível do app) do seu app.
  • Substitua o plug-in do Gradle do Google Services no arquivo Gradle do módulo (nível do app) (geralmente app/build.gradle) pelo plug-in Strict Version Matcher:

Antes

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

android {
  // …
}

Depois

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

android {
  // …
}
  • Substitua o caminho de classe do plug-in do Gradle para Serviços do Google no seu arquivo Gradle (build.gradle) do projeto (nível raiz) pelo do plug-in Strict Version Matcher:

Antes

buildscript {
  dependencies {
    // ...

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

Depois

buildscript {
  dependencies {
    // ...

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

Exclua o app do Firebase no Console do Firebase de acordo com as instructions no site de suporte do Firebase.

Como buscar ajuda

Se tiver algum problema, confira nossa página da comunidade, em que descrevemos os canais disponíveis para entrar em contato conosco.