Android

23 jan, 2017

Apresentando a biblioteca de suporte ExifInterface

Publicidade

Este artigo é do Android Security Team. Ele foi escrito por Ian Lake. A tradução foi feita pela 

Com o lançamento da Biblioteca de Suporte 25.1.0, há uma nova entrada na família: a Biblioteca de Suporte ExifInterface. Com melhorias significativas introduzidas no Android 7.1 para o framework ExifInterface, só fazia sentido disponibilizá-las para todos os dispositivos API versão 9 ou superior através do ExifInterface da Biblioteca de Suporte.

O básico ainda é o mesmo: a capacidade de ler e escrever tags Exif embutidas dentro de arquivos de imagem: agora com 140 atributos diferentes (quase 100 deles novos para o Android 7.1/esta Biblioteca de Suporte!), incluindo informações sobre a câmera em si, as configurações da câmera, orientação e coordenadas GPS.

Aplicativos de câmera: escrita de Atributos Exif

Para aplicativos de Câmera, a escrita é provavelmente o mais importante – os atributos de escrita ainda estão limitados a arquivos de imagem JPEG. Normalmente, você não precisaria usar isso durante a captura da própria câmera – ao invés disso, você iria chamar CaptureRequest.Builder.set () com JPEG_ORIENTATION, JPEG_GPS_LOCATION da Camera2 API ou equivalentes na Camera1 Camera.Parameters. No entanto, usar o ExifInterface permite que você faça alterações no arquivo após o fato (digamos, removendo as informações de local a pedido do usuário).

Leitura de Atributos Exif

Para o resto de nós, porém, ler esses atributos será nosso pão com manteiga; este é o lugar onde vemos as maiores melhorias.

Primeiramente, você pode ler dados Exif de imagens JPEG e RAW (especificamente, arquivos DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW e RAF). Esta foi uma grande reestruturação, removendo todas as dependências nativas e construindo um extenso conjunto de testes para garantir que tudo realmente funciona.

Para aplicativos que recebem imagens de outros aplicativos com um conteúdo: // URI (como aquelas enviadas por aplicativos que têm como alvo a API 24 ou superior), o ExifInterface agora funciona diretamente em um InputStream; isso permite extrair facilmente informações Exif diretamente do conteúdo: // URIs que você recebe sem ter que criar um arquivo temporário.

Uri uri; // the URI you've received from the other app
InputStream in;
try {
  in = getContentResolver().openInputStream(uri);
  ExifInterface exifInterface = new ExifInterface(in);
  // Now you can extract any Exif tag you want
  // Assuming the image is a JPEG or supported raw format
} catch (IOException e) {
  // Handle any errors
} finally {
  if (in != null) {
    try {
      in.close();
    } catch (IOException ignored) {}
  }
}

Observação: ExifInterface não funcionará com InputStreams remoto, como aqueles retornados de uma HttpURLConnection. É altamente recomendável usar somente com conteúdo: // ou arquivo: // URIs.

Para a maioria dos atributos, basta simplesmente usará os métodos getAttributeInt (), getAttributeDouble () ou getAttribute () (para Strings) conforme apropriado.

Um dos atributos mais importantes quando se trata de exibir imagens é a orientação da imagem, armazenada no apropriadamente chamado TAG_ORIENTATION, que retorna uma das constantes ORIENTATION_. Para converter isso em um ângulo de rotação, você pode processar o valor posteriormente.

int rotation = 0;
int orientation = exifInterface.getAttributeInt(
    ExifInterface.TAG_ORIENTATION,
    ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
  case ExifInterface.ORIENTATION_ROTATE_90:
    rotation = 90;
    break;
  case ExifInterface.ORIENTATION_ROTATE_180:
    rotation = 180;
    break;
  case ExifInterface.ORIENTATION_ROTATE_270:
    rotation = 270;
    break;
}

Existem alguns métodos auxiliares para extrair valores de tags Exif específicas. Para dados de localização, o método getLatLong () lhe dá a latitude e a longitude como floats e getAltitude () irá lhe dar a altitude em metros. Algumas imagens também incorporam uma pequena miniatura. Você pode verificar sua existência com hasThumbnail () e, então, extrair a representação byte [] da miniatura com getThumbnail () – perfeito para passar para BitmapFactory.decodeByteArray ().

Trabalhando com Exif: Tudo é opcional

Uma coisa que é importante entender com os dados da Exif é que não há tags necessárias: Todas as tag são opcionais – alguns serviços até mesmo tiram dados Exif especificamente. Portanto, em todo o seu código, você deve sempre lidar com casos onde não há dados Exif, quer devido a nenhum dado para um atributo específico ou a um formato de imagem que não suporta nenhum dado Exif (digamos, os PNGs ubíquos ou imagens WebP).

Adicione a Biblioteca de Suporte ExifInterface ao seu projeto com a seguinte dependência:

compile "com.android.support:exifinterface:25.1.0"

Mas quando um atributo Exif é exatamente o que você precisa para evitar uma imagem mal rotacionada em seu aplicativo, a Biblioteca de Suporte ExifInterface é exatamente o que você precisa para #ConstruirMelhoresApps

 

***

Este artigo é do Android Security Team. Ele foi escrito por Ian Lake. A tradução foi feita pela Redação iMasters com autorização. Você pode acessar o original em: https://android-developers.googleblog.com/2016/12/introducing-the-exifinterface-support-library.html