2017-02-08 7 views
0

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.

Répondre

1

Si dans votre première variante vous obtenez toujours 0 pour l'orientation, vous pouvez essayer ce qui suit. (De this post)

Essayez d'utiliser les informations dans le curseur de contenu.

float photoRotation = 0; 
boolean hasRotation = false; 
String[] projection = { Images.ImageColumns.ORIENTATION }; 
try { 
    Cursor cursor = getActivity().getContentResolver().query(photoUri, projection, null, null, null); 
    if (cursor.moveToFirst()) { 
     photoRotation = cursor.getInt(0); 
     hasRotation = true; 
    } 
    cursor.close(); 
} catch (Exception e) {} 

if (!hasRotation) { 
    ExifInterface exif = new ExifInterface(photoUri.getPath()); 
    int exifRotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
      ExifInterface.ORIENTATION_UNDEFINED); 

    switch (exifRotation) { 
     case ExifInterface.ORIENTATION_ROTATE_90: { 
      photoRotation = 90.0f; 
      break; 
     } 
     case ExifInterface.ORIENTATION_ROTATE_180: { 
      photoRotation = 180.0f; 
      break; 
     } 
     case ExifInterface.ORIENTATION_ROTATE_270: { 
      photoRotation = 270.0f; 
      break; 
     } 
    } 
} 
+0

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

+0

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à. –

+0

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

0

Dans certains périphériques, l'image du périphérique samsumg est au maximum de 90 degrés. pour cela vous devez vérifier dans le fichier exif quelle est l'orientation exacte de celui-ci et selon ce que vous devez travailler.

int rotateDegree = 0; 
       try { 
        File imageFile = new File(sourcepath); 
        ExifInterface exif = new ExifInterface(
          imageFile.getAbsolutePath()); 
        int orientation = exif.getAttributeInt(
          ExifInterface.TAG_ORIENTATION, 
          ExifInterface.ORIENTATION_NORMAL); 

        switch (orientation) { 
        case ExifInterface.ORIENTATION_ROTATE_270: 
         rotateDegree = 270; 
         break; 
        case ExifInterface.ORIENTATION_ROTATE_180: 
         rotateDegree = 180; 
         break; 
        case ExifInterface.ORIENTATION_ROTATE_90: 
         rotateDegree = 90; 
         break; 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       Matrix matrix = new Matrix(); 
     matrix.postRotate(rotateDegree); 
     bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
+0

Nous vous remercions de votre réponse. Cependant, la rotation se produit toujours. En tout cas merci. – Svitlana