Pregunta ¿Cómo obtener datos Exif de un InputStream en lugar de un archivo?


La razón por la que estoy preguntando esto es porque la devolución de llamada del selector de archivos Intent devuelve un Uri.

Abrir el selector de archivos a través de la intención:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), CHOOSE_IMAGE_REQUEST);

Llamar de vuelta:

@Override
public void onActivityResult(int requestCode, int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == CHOOSE_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) {

        if (data == null) {
            // Error
            return;
        }

        Uri fileUri = data.getData();
        InputStream in = getContentResolver().openInputStream(fileUri);

        // How to determine image orientation through Exif data here?
    }
}

Una forma sería escribir el InputStream a un real File, pero esto parece ser una mala solución para mí.


6
2017-09-16 21:57


origen


Respuestas:


Después de que se introdujo la biblioteca de soporte 25.1.0, ahora es posible leer datos exif del contenido URI (contenido: // o archivo: //) a través de un InputStream.

Ejemplo: Primero agregue esta línea a su archivo de gradle:

compilar 'com.android.support:exifinterface:25.1.0'

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

Para más información, verifique: Presentamos la biblioteca de soporte de ExifInterface, ExifInterface.


10
2018-01-24 17:56