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