J'ai mis en œuvre fonctionnelle de capture/chosing image et cela fonctionne très bien sur HTC, cependant, sur Samsung Galaxy Note 4 (version Android est 5.1.1), il tourne l'image de 90 degrés . Voici 2 variantes de code, mais encore tourné:Image capturée ou cueillette de la photo pivotée par imagelibrary par 90 degrés
VARIANT 1:
public void captureImageCameraOrGallery() {
Intent galleryintent = new Intent(Intent.ACTION_GET_CONTENT, null);
galleryintent.setType("image/*");
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Intent chooser = new Intent(Intent.ACTION_CHOOSER);
chooser.putExtra(Intent.EXTRA_INTENT, galleryintent);
chooser.putExtra(Intent.EXTRA_TITLE, "Select from:");
Intent[] intentArray = { cameraIntent };
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
startActivityForResult(chooser, REQUEST_PIC);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_PIC && resultCode == RESULT_OK) {
Uri selectedImageUri = data.getData();
Bitmap bmp = null;
try {
if (selectedImageUri != null) {
bmp = getBitmapFromUri(selectedImageUri);
}
if (bmp == null) {
return;
}
ExifInterface ei = new ExifInterface(selectedImageUri.getPath());
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
Log.e("Capture orientation: ", String.valueOf(orientation));
int rotateAngle = 0;
switch(orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotateAngle = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotateAngle = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotateAngle = 270;
break;
default:
break;
}
bmp = rotateImage(bmp, rotateAngle);
mUserImage.setImageBitmap(bmp);
} catch (IOException e) {
e.printStackTrace();
}
}
}
VARIANT 2:
En utilisant PhotoPicker lib compilation « me.iwf.photopicker: PhotoPicker: 0.9.5 @ aar '
public void captureImageCameraOrGallery() {
PhotoPicker.builder()
.setPhotoCount(1)
.setShowCamera(true)
.setShowGif(true)
.setPreviewEnabled(false)
.start(this, PhotoPicker.REQUEST_CODE);
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == PhotoPicker.REQUEST_CODE) {
if (data != null) {
ArrayList<String> photos = data.getStringArrayListExtra(PhotoPicker.KEY_SELECTED_PHOTOS);
Uri selectedImageUri = Uri.fromFile(new File(photos.get(0)));
Bitmap bmp = null;
try {
if (selectedImageUri != null) {
bmp = getBitmapFromUri(selectedImageUri);
}
if (bmp == null) {
return;
}
mUserImage.setImageBitmap(bmp);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Cependant, il tourne toujours. Toute aide serait appréciée.
Désolé un peu mélangé avec le drapeau! HasRotation. Est-ce qu'on fait une rotation dans le cas où (! HasRotation) {// rotate} else {// devrait charger l'image sans rotation ici? } – Svitlana
Il y a une double vérification - d'abord nous vérifions si le contenu est tourné avec 'Cursor', si c'est le cas, nous mettons un drapeau et ne vérifions pas les informations exif, sinon vérifions les informations exif et obtenons les données de rotation à partir de là. –
Ok, je vous remercie! Et encore une question devrais-je configurer smth comme ceci: intention.putExtra (MediaStore.EXTRA_OUTPUT, mCapturedImageURI); quand appelez new Intent et utilisez mCapturedImageURI comme variable globale? Est-ce que MediaStore.EXTRA_OUTPUT a une grande influence? Ou je peux l'obtenir juste Uri photoUri = data.getData(); dans onActivityResult directement? – Svitlana