diff --git a/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/CameraPickerActivity.java b/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/CameraPickerActivity.java index 3a33e9a..c00bb9f 100644 --- a/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/CameraPickerActivity.java +++ b/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/CameraPickerActivity.java @@ -12,8 +12,12 @@ import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; +import android.util.Log; + +import com.shz.imagepicker.imagepicker.util.FileOrientationHandler; import java.io.File; +import java.io.IOException; import java.util.ArrayList; public class CameraPickerActivity extends Activity { @@ -26,6 +30,7 @@ public class CameraPickerActivity extends Activity { private static final String FILE_PROVIDER_PREFIX = ".provider"; private String mFilename; + private FileOrientationHandler fileOrientationHandler = new FileOrientationHandler(); @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { @@ -47,6 +52,13 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { Uri uri = ImagePath.getCaptureImageResultUri(this, data, mFilename); Uri uriFile = ImagePath.getNormalizedUri(this, uri); File file = new File(uriFile.getPath()); + + try{ + fileOrientationHandler.rotateAndReWriteImageFile(file); + }catch (IOException e){ + Log.d(this.getClass().getSimpleName(),"Error rotation image "+e.getLocalizedMessage()); + } + files.add(file); mCallback.onImagesSelected(files); } @@ -94,4 +106,7 @@ private void startCameraPicker() { startActivityForResult(cameraIntent, IMAGE_REQUEST_CAMERA); } } + + + } \ No newline at end of file diff --git a/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/GalleryMultiPickerActivity.java b/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/GalleryMultiPickerActivity.java index c14fba2..26ca1f7 100644 --- a/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/GalleryMultiPickerActivity.java +++ b/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/GalleryMultiPickerActivity.java @@ -5,16 +5,22 @@ import android.content.ClipData; import android.content.Intent; import android.content.pm.PackageManager; +import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.Parcelable; import android.provider.MediaStore; import android.util.Log; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; +import com.shz.imagepicker.imagepicker.util.FileOrientationHandler; + import java.io.File; +import java.io.IOException; +import java.net.URI; import java.util.ArrayList; public class GalleryMultiPickerActivity extends Activity { @@ -22,9 +28,10 @@ public class GalleryMultiPickerActivity extends Activity { public static ImagePickerCallback mCallback; private static final int PERMISSION_REQUEST_READ_STORAGE = 54564; - private static final int IMAGE_REQUEST_GALLERY = 54565; + private static final int IMAGE_REQUEST_GALLERY = 1; private static final String GALLERY_IMAGE_MIME = "image/jpeg"; + private FileOrientationHandler fileOrientationHandler = new FileOrientationHandler(); @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { @@ -48,17 +55,34 @@ protected void onCreate(Bundle savedInstanceState) { protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK && requestCode == IMAGE_REQUEST_GALLERY) { - if (data != null && data.getData() != null) { + + + if (data != null) { ArrayList files = new ArrayList<>(); - /*if (data.getData() != null) { + + if (data.getExtras() != null) { + ArrayList fileUris = data.getExtras().getParcelableArrayList("selectedItems"); + + for (Parcelable uri : fileUris) { + if (uri instanceof Uri) { + files.add(new File(getRealPathFromURI((Uri) uri))); + } + + } + + + } + + if (data.getData() != null) { Log.d("MultiPicker", "data: " + data.getData().toString()); String filename = ImagePath.getImagePathFromInputStreamUri(this, data.getData()); File file = new File(filename); if (file.exists()) { files.add(file); } - }*/ + } + if (data.getClipData() != null) { ClipData clipData = data.getClipData(); @@ -72,18 +96,41 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { } } + + try { + for (File file : + files) { + fileOrientationHandler.rotateAndReWriteImageFile(file); + } + } catch (IOException e) { + Log.d(this.getClass().getSimpleName(), "Error rotating image " + e.getLocalizedMessage()); + } + + mCallback.onImagesSelected(files); } } finish(); } + public String getRealPathFromURI(Uri contentUri) { + String path = null; + String[] proj = {MediaStore.MediaColumns.DATA}; + Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null); + if (cursor.moveToFirst()) { + int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); + path = cursor.getString(column_index); + } + cursor.close(); + return path; + } + private void checkGalleryPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { ActivityCompat.requestPermissions( this, - new String[] { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_READ_STORAGE ); } else { @@ -93,10 +140,15 @@ private void checkGalleryPermission() { private void startGalleryPicker() { Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - if (Build.VERSION.SDK_INT >= 18) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { galleryIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); } - galleryIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, GALLERY_IMAGE_MIME); + galleryIntent.putExtra("multi-pick", true); + + + //galleryIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, GALLERY_IMAGE_MIME); startActivityForResult(galleryIntent, IMAGE_REQUEST_GALLERY); + } } \ No newline at end of file diff --git a/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/GallerySinglePickerActivity.java b/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/GallerySinglePickerActivity.java index e22f262..475312b 100644 --- a/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/GallerySinglePickerActivity.java +++ b/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/GallerySinglePickerActivity.java @@ -11,7 +11,10 @@ import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; +import com.shz.imagepicker.imagepicker.util.FileOrientationHandler; + import java.io.File; +import java.io.IOException; import java.util.ArrayList; public class GallerySinglePickerActivity extends Activity { @@ -22,6 +25,8 @@ public class GallerySinglePickerActivity extends Activity { private static final int IMAGE_REQUEST_GALLERY = 54563; private static final String GALLERY_IMAGE_MIME = "image/jpeg"; + private FileOrientationHandler fileOrientationHandler = new FileOrientationHandler(); + @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { @@ -45,6 +50,13 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d("SinglePicker", "data: " + data.getData().toString()); File file = new File(filename); if (file.exists()) { + + try{ + fileOrientationHandler.rotateAndReWriteImageFile(file); + }catch (IOException e){ + Log.d(this.getClass().getSimpleName(),"Error rotation image "+e.getLocalizedMessage()); + } + files.add(file); mCallback.onImagesSelected(files); } diff --git a/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/util/FileOrientationHandler.java b/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/util/FileOrientationHandler.java new file mode 100644 index 0000000..e6c4a0c --- /dev/null +++ b/imagepicker/src/main/java/com/shz/imagepicker/imagepicker/util/FileOrientationHandler.java @@ -0,0 +1,66 @@ +package com.shz.imagepicker.imagepicker.util; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Matrix; +import android.media.ExifInterface; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +public class FileOrientationHandler { + + + public void rotateAndReWriteImageFile(File file) throws IOException { + + // Bitmap is rotated according to camera orientation + rotateImageIfRequired(file); + } + + + private void rotateImageIfRequired(File file) throws IOException{ + ExifInterface ei = new ExifInterface(file.getAbsolutePath()); + int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, + ExifInterface.ORIENTATION_UNDEFINED); + + Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); + + Bitmap rotatedBitmap; + switch(orientation) { + + case ExifInterface.ORIENTATION_ROTATE_90: + rotatedBitmap = rotateImage(bitmap, 90); + saveBitmap(rotatedBitmap,file); + break; + + case ExifInterface.ORIENTATION_ROTATE_180: + rotatedBitmap = rotateImage(bitmap, 180); + saveBitmap(rotatedBitmap,file); + break; + + case ExifInterface.ORIENTATION_ROTATE_270: + rotatedBitmap = rotateImage(bitmap, 270); + saveBitmap(rotatedBitmap,file); + break; + + case ExifInterface.ORIENTATION_NORMAL: + default: + } + + } + + private static Bitmap rotateImage(Bitmap source, float angle) { + Matrix matrix = new Matrix(); + matrix.postRotate(angle); + return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), + matrix, true); + } + + private void saveBitmap(Bitmap rotatedBitmap,File file) throws IOException{ + FileOutputStream out = new FileOutputStream(file.getAbsolutePath()); + rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); + } + + +}