Skip to content

Commit 9ebc687

Browse files
Fixed Image Rotation & MultiSelect (#1)
* Update GalleryMultiPickerActivity.java * Update intent * Update Choser * Update intent data * Update GalleryMultiPickerActivity.java * multi select from samsung * Orientation Issue Resolve * Update GallerySinglePickerActivity.java
1 parent 32cc23e commit 9ebc687

File tree

4 files changed

+152
-7
lines changed

4 files changed

+152
-7
lines changed

imagepicker/src/main/java/com/shz/imagepicker/imagepicker/CameraPickerActivity.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@
1212
import android.os.Build;
1313
import android.os.Bundle;
1414
import android.provider.MediaStore;
15+
import android.util.Log;
16+
17+
import com.shz.imagepicker.imagepicker.util.FileOrientationHandler;
1518

1619
import java.io.File;
20+
import java.io.IOException;
1721
import java.util.ArrayList;
1822

1923
public class CameraPickerActivity extends Activity {
@@ -26,6 +30,7 @@ public class CameraPickerActivity extends Activity {
2630
private static final String FILE_PROVIDER_PREFIX = ".provider";
2731

2832
private String mFilename;
33+
private FileOrientationHandler fileOrientationHandler = new FileOrientationHandler();
2934

3035
@Override
3136
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
@@ -47,6 +52,13 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
4752
Uri uri = ImagePath.getCaptureImageResultUri(this, data, mFilename);
4853
Uri uriFile = ImagePath.getNormalizedUri(this, uri);
4954
File file = new File(uriFile.getPath());
55+
56+
try{
57+
fileOrientationHandler.rotateAndReWriteImageFile(file);
58+
}catch (IOException e){
59+
Log.d(this.getClass().getSimpleName(),"Error rotation image "+e.getLocalizedMessage());
60+
}
61+
5062
files.add(file);
5163
mCallback.onImagesSelected(files);
5264
}
@@ -94,4 +106,7 @@ private void startCameraPicker() {
94106
startActivityForResult(cameraIntent, IMAGE_REQUEST_CAMERA);
95107
}
96108
}
109+
110+
111+
97112
}

imagepicker/src/main/java/com/shz/imagepicker/imagepicker/GalleryMultiPickerActivity.java

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,33 @@
55
import android.content.ClipData;
66
import android.content.Intent;
77
import android.content.pm.PackageManager;
8+
import android.database.Cursor;
89
import android.net.Uri;
910
import android.os.Build;
1011
import android.os.Bundle;
12+
import android.os.Parcelable;
1113
import android.provider.MediaStore;
1214
import android.util.Log;
1315

1416
import androidx.core.app.ActivityCompat;
1517
import androidx.core.content.ContextCompat;
1618

19+
import com.shz.imagepicker.imagepicker.util.FileOrientationHandler;
20+
1721
import java.io.File;
22+
import java.io.IOException;
23+
import java.net.URI;
1824
import java.util.ArrayList;
1925

2026
public class GalleryMultiPickerActivity extends Activity {
2127

2228
public static ImagePickerCallback mCallback;
2329

2430
private static final int PERMISSION_REQUEST_READ_STORAGE = 54564;
25-
private static final int IMAGE_REQUEST_GALLERY = 54565;
31+
private static final int IMAGE_REQUEST_GALLERY = 1;
2632

2733
private static final String GALLERY_IMAGE_MIME = "image/jpeg";
34+
private FileOrientationHandler fileOrientationHandler = new FileOrientationHandler();
2835

2936
@Override
3037
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
@@ -48,17 +55,34 @@ protected void onCreate(Bundle savedInstanceState) {
4855
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
4956
super.onActivityResult(requestCode, resultCode, data);
5057
if (resultCode == Activity.RESULT_OK && requestCode == IMAGE_REQUEST_GALLERY) {
51-
if (data != null && data.getData() != null) {
58+
59+
60+
if (data != null) {
5261
ArrayList<File> files = new ArrayList<>();
5362

54-
/*if (data.getData() != null) {
63+
64+
if (data.getExtras() != null) {
65+
ArrayList<Parcelable> fileUris = data.getExtras().getParcelableArrayList("selectedItems");
66+
67+
for (Parcelable uri : fileUris) {
68+
if (uri instanceof Uri) {
69+
files.add(new File(getRealPathFromURI((Uri) uri)));
70+
}
71+
72+
}
73+
74+
75+
}
76+
77+
if (data.getData() != null) {
5578
Log.d("MultiPicker", "data: " + data.getData().toString());
5679
String filename = ImagePath.getImagePathFromInputStreamUri(this, data.getData());
5780
File file = new File(filename);
5881
if (file.exists()) {
5982
files.add(file);
6083
}
61-
}*/
84+
}
85+
6286
if (data.getClipData() != null) {
6387
ClipData clipData = data.getClipData();
6488

@@ -72,18 +96,41 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
7296
}
7397
}
7498

99+
100+
try {
101+
for (File file :
102+
files) {
103+
fileOrientationHandler.rotateAndReWriteImageFile(file);
104+
}
105+
} catch (IOException e) {
106+
Log.d(this.getClass().getSimpleName(), "Error rotating image " + e.getLocalizedMessage());
107+
}
108+
109+
75110
mCallback.onImagesSelected(files);
76111
}
77112
}
78113
finish();
79114
}
80115

116+
public String getRealPathFromURI(Uri contentUri) {
117+
String path = null;
118+
String[] proj = {MediaStore.MediaColumns.DATA};
119+
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
120+
if (cursor.moveToFirst()) {
121+
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
122+
path = cursor.getString(column_index);
123+
}
124+
cursor.close();
125+
return path;
126+
}
127+
81128
private void checkGalleryPermission() {
82129
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED
83130
|| ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
84131
ActivityCompat.requestPermissions(
85132
this,
86-
new String[] { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE },
133+
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},
87134
PERMISSION_REQUEST_READ_STORAGE
88135
);
89136
} else {
@@ -93,10 +140,15 @@ private void checkGalleryPermission() {
93140

94141
private void startGalleryPicker() {
95142
Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
96-
if (Build.VERSION.SDK_INT >= 18) {
143+
144+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
97145
galleryIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
98146
}
99-
galleryIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, GALLERY_IMAGE_MIME);
147+
galleryIntent.putExtra("multi-pick", true);
148+
149+
150+
//galleryIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, GALLERY_IMAGE_MIME);
100151
startActivityForResult(galleryIntent, IMAGE_REQUEST_GALLERY);
152+
101153
}
102154
}

imagepicker/src/main/java/com/shz/imagepicker/imagepicker/GallerySinglePickerActivity.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
import androidx.core.app.ActivityCompat;
1212
import androidx.core.content.ContextCompat;
1313

14+
import com.shz.imagepicker.imagepicker.util.FileOrientationHandler;
15+
1416
import java.io.File;
17+
import java.io.IOException;
1518
import java.util.ArrayList;
1619

1720
public class GallerySinglePickerActivity extends Activity {
@@ -22,6 +25,8 @@ public class GallerySinglePickerActivity extends Activity {
2225
private static final int IMAGE_REQUEST_GALLERY = 54563;
2326

2427
private static final String GALLERY_IMAGE_MIME = "image/jpeg";
28+
private FileOrientationHandler fileOrientationHandler = new FileOrientationHandler();
29+
2530

2631
@Override
2732
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
@@ -45,6 +50,13 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
4550
Log.d("SinglePicker", "data: " + data.getData().toString());
4651
File file = new File(filename);
4752
if (file.exists()) {
53+
54+
try{
55+
fileOrientationHandler.rotateAndReWriteImageFile(file);
56+
}catch (IOException e){
57+
Log.d(this.getClass().getSimpleName(),"Error rotation image "+e.getLocalizedMessage());
58+
}
59+
4860
files.add(file);
4961
mCallback.onImagesSelected(files);
5062
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.shz.imagepicker.imagepicker.util;
2+
3+
import android.graphics.Bitmap;
4+
import android.graphics.BitmapFactory;
5+
import android.graphics.Matrix;
6+
import android.media.ExifInterface;
7+
8+
import java.io.File;
9+
import java.io.FileOutputStream;
10+
import java.io.IOException;
11+
12+
public class FileOrientationHandler {
13+
14+
15+
public void rotateAndReWriteImageFile(File file) throws IOException {
16+
17+
// Bitmap is rotated according to camera orientation
18+
rotateImageIfRequired(file);
19+
}
20+
21+
22+
private void rotateImageIfRequired(File file) throws IOException{
23+
ExifInterface ei = new ExifInterface(file.getAbsolutePath());
24+
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
25+
ExifInterface.ORIENTATION_UNDEFINED);
26+
27+
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
28+
29+
Bitmap rotatedBitmap;
30+
switch(orientation) {
31+
32+
case ExifInterface.ORIENTATION_ROTATE_90:
33+
rotatedBitmap = rotateImage(bitmap, 90);
34+
saveBitmap(rotatedBitmap,file);
35+
break;
36+
37+
case ExifInterface.ORIENTATION_ROTATE_180:
38+
rotatedBitmap = rotateImage(bitmap, 180);
39+
saveBitmap(rotatedBitmap,file);
40+
break;
41+
42+
case ExifInterface.ORIENTATION_ROTATE_270:
43+
rotatedBitmap = rotateImage(bitmap, 270);
44+
saveBitmap(rotatedBitmap,file);
45+
break;
46+
47+
case ExifInterface.ORIENTATION_NORMAL:
48+
default:
49+
}
50+
51+
}
52+
53+
private static Bitmap rotateImage(Bitmap source, float angle) {
54+
Matrix matrix = new Matrix();
55+
matrix.postRotate(angle);
56+
return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
57+
matrix, true);
58+
}
59+
60+
private void saveBitmap(Bitmap rotatedBitmap,File file) throws IOException{
61+
FileOutputStream out = new FileOutputStream(file.getAbsolutePath());
62+
rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
63+
}
64+
65+
66+
}

0 commit comments

Comments
 (0)