Android Camera Intent Enregistrement Image Paysage Lorsqu'il est pris Portrait

J'ai jeté un coup d'œil, mais il ne semble pas y avoir de réponse / solution solide au problème très irritant.

Je prends une photo en orientation portrait et lorsque je touche enregistrer / jeter les boutons sont également dans l'orientation correcte. Le problème est quand je récupère l'image plus tard, elle est en orientation paysage (l'image a été tournée de 90 degrés dans le sens inverse des aiguilles d'une montre)

  • Android AdapterView?
  • Studio Android 1.5.1: Impossible de trouver la propriété 'vectorDrawables'
  • Comment puis-je seulement créer un paysage pour les tablettes et seulement le portrait pour les téléphones?
  • Impossible de trouver le style 'mapViewStyle' dans le thème actuel
  • L'icône du menu des options Android ne s'affiche pas
  • Comment réparer android studios 2.3 NDK bug?
  • Je ne veux pas obliger l'utilisateur à utiliser l'appareil dans une certaine orientation.

    Existe-t-il un moyen de détecter si la photo a été prise en mode portrait, puis décoder le bitmap et le déplacer correctement?

  • Les onglets TabLayout ne s'affichent pas
  • EditText getHint () renvoie null lors de l'utilisation de la bibliothèque de support de conception
  • Performance de l'application Phonegap par rapport à la performance native de l'application
  • Impossible de trouver la classe XXX référencée à partir de la méthode XXX. <YYY>
  • Comment lire des codes à barres à l'aide de Android Phonegap?
  • Effectuez des modifications persistantes dans init.rc
  • 2 Solutions collect form web for “Android Camera Intent Enregistrement Image Paysage Lorsqu'il est pris Portrait”

    L'image est toujours prise dans l'orientation que la caméra est intégrée dans le périphérique. Pour que votre image soit correctement tournée, vous devrez lire les informations d'orientation qui sont stockées dans l'image (métadonnées EXIF). Là, il est stocké comment l'appareil était orienté, lorsque l'image a été prise.

    Voici un code qui lit les données EXIF ​​et fait pivoter l'image en conséquence: le file est le nom du fichier image.

     BitmapFactory.Options bounds = new BitmapFactory.Options(); bounds.inJustDecodeBounds = true; BitmapFactory.decodeFile(file, bounds); BitmapFactory.Options opts = new BitmapFactory.Options(); Bitmap bm = BitmapFactory.decodeFile(file, opts); ExifInterface exif = new ExifInterface(file); String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION); int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL; int rotationAngle = 0; if (orientation == ExifInterface.ORIENTATION_ROTATE_90) rotationAngle = 90; if (orientation == ExifInterface.ORIENTATION_ROTATE_180) rotationAngle = 180; if (orientation == ExifInterface.ORIENTATION_ROTATE_270) rotationAngle = 270; Matrix matrix = new Matrix(); matrix.setRotate(rotationAngle, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2); Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bounds.outWidth, bounds.outHeight, matrix, true); 

    MISE À JOUR 2017-01-16

    Avec la publication de la bibliothèque de support 25.1.0, une bibliothèque de support ExifInterface a été introduite, ce qui pourrait rendre l'accès aux attributs Exif plus facile. Consultez le Blog du développeur Android pour un article à ce sujet.

    La réponse sélectionnée utilise la méthode la plus courante répond à cette question et à des questions similaires. Cependant, cela ne m'a pas fonctionné avec des caméras avant et arrière sur Samsung. Pour ceux qui ont besoin d'une autre solution qui fonctionne à la fois sur les caméras avant et arrière pour Samsung et d'autres grands fabricants, cette réponse de nvhausid est géniale:

    https://stackoverflow.com/a/18915443/6080472

    Pour ceux qui ne veulent pas cliquer, la magie pertinente consiste à utiliser CameraInfo plutôt que de s'appuyer sur EXIF ​​ou un Cursor sur les fichiers multimédias.

     Bitmap realImage = BitmapFactory.decodeByteArray(data, 0, data.length); android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(mCurrentCameraId, info); Bitmap bitmap = rotate(realImage, info.orientation); 

    Code complet dans le lien.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.