2017-02-09 2 views
3

J'ai besoin de lire quelques propriétés Exif d'un Image (pris avec le Camera ou pris du Gallery).données Android EXIF ​​Image de l'appareil photo ou galerie perdue

Voici comment je lance le Camera:

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
    File file = new File(myObject.getLocalUrl()); 
    Uri fileURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", file); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileURI); 
    startActivityForResult(intent, CAPTURE_IMAGE_REQUEST_CODE); 

Voici comment je lance le GalleryPicker:

Intent intent = new Intent(); 
intent.setType("image/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); 
startActivityForResult(Intent.createChooser(intent, getString(R.string.image_picker_select_image)), SELECT_IMAGE_FROM_GALLERY_REQUEST_CODE); 

Le problème est que, par exemple, dans le premier cas (Camera), après le Image est pris et enregistré dans le ExternalStorage, l'information Exif se perdre.

La même chose pour le Images pris dans le Gallery. Voilà comment je reçois le Image dans la méthode onActivityResult:

Uri uri = data.getData(); 
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); 

Et enfin voici comment je lis les données Exif:

ExifInterface exifInterface = null; 
    try { 
     exifInterface = new ExifInterface(myObject.getLocalUrl()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    String exifOrientation = exifInterface.getAttribute(ExifInterface.TAG_ORIENTATION); 
    String exifMake = exifInterface.getAttribute(ExifInterface.TAG_MAKE); 
    String exifModel = exifInterface.getAttribute(ExifInterface.TAG_MODEL); 

J'ai essayé la prochaine:

  1. Prenez un picture en utilisant mon appareil Camera (sans utiliser mon App). Lire les données Exif en utilisant ExifInterface.
  2. Cela fonctionne comme un charme.

donc je suppose que le problème est que lorsque le Image est sauvé (après il est pris avec le Camera) ou Image est prélevée du Gallery, les données Exif se perd.

J'ai lu au moins 20-30 post ici en Stackoverflow mais fondamentalement le problème que tout le monde a est que le orientationexif l'information est perdue, de sorte que la solution est en train d'écrire le droit orientation dans les Exif données.

Cette solution n'est pas bien pour moi puisque je ne veux pas écraser les données Exif, je veux juste lire l'original.

Des idées/indices? Merci.

+0

'nouvelle ExifInterface (myObject.getLocalUrl());'. Qu'est-ce que myObject? Qu'est-ce que cela a à voir avec onActivityResult()? Mieux afficher le code complet. – greenapps

+0

'Voilà comment j'obtiens l'image dans la méthode onActivityResult:'. Sans importance. N'a pas d'importance. Vous devriez nous montrer comment vous obtenez l'exif du fichier .jpg. – greenapps

+0

'le problème que tout le monde a est que l'information exif d'orientation est perdue, de sorte que la solution écrit la bonne orientation dans les données Exif. Tout cela n'a aucun sens pour moi. Les fichiers JPG ne perdent pas d'informations exif. – greenapps

Répondre

0

Essayez avec méthode ci-dessous: passer Uri dans cette méthode

public static int getOrientation(Context context, Uri photoUri) { 
      Cursor cursor = context.getContentResolver().query(photoUri, 
      new String[] { MediaStore.Images.ImageColumns.ORIENTATION },null, null, null); 
      try { 
       if (cursor.moveToFirst()) { 
        return cursor.getInt(0); 
       } else { 
        return -1; 
       } 
      } finally { 
       cursor.close(); 
      } 
     } 

Il y a beaucoup de ImageColumns sont disponibles des informations d'image reclassement.

+0

J'ai essayé d'utiliser la méthode 'ExifInterface' et cette méthode et dans les deux cas, je n'ai que 0 comme orientation pour chaque image des deux téléphones que j'ai testés (Moto G4 et Samsung Galaxy J5) –