Skip to content

Commit c692400

Browse files
author
dhimant.desai
committed
Added Utility classes like ExifUtil, PathUtil, PermissionUtils
1 parent 94a2672 commit c692400

File tree

3 files changed

+356
-0
lines changed

3 files changed

+356
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package com.dhims.androidutils;
2+
3+
import android.graphics.Bitmap;
4+
import android.graphics.Matrix;
5+
import android.os.Build;
6+
7+
import java.io.IOException;
8+
import java.lang.reflect.Constructor;
9+
import java.lang.reflect.Field;
10+
import java.lang.reflect.InvocationTargetException;
11+
import java.lang.reflect.Method;
12+
13+
/**
14+
* Utility functions for handling Exif.
15+
*
16+
* @author Dhimant Desai ([email protected])
17+
*/
18+
public class ExifUtil {
19+
20+
public static Bitmap rotateBitmap(String src, Bitmap bitmap) {
21+
try {
22+
int orientation = getExifOrientation(src);
23+
24+
if (orientation == 1) {
25+
return bitmap;
26+
}
27+
28+
Matrix matrix = new Matrix();
29+
switch (orientation) {
30+
case 2:
31+
matrix.setScale(-1, 1);
32+
break;
33+
case 3:
34+
matrix.setRotate(180);
35+
break;
36+
case 4:
37+
matrix.setRotate(180);
38+
matrix.postScale(-1, 1);
39+
break;
40+
case 5:
41+
matrix.setRotate(90);
42+
matrix.postScale(-1, 1);
43+
break;
44+
case 6:
45+
matrix.setRotate(90);
46+
break;
47+
case 7:
48+
matrix.setRotate(-90);
49+
matrix.postScale(-1, 1);
50+
break;
51+
case 8:
52+
matrix.setRotate(-90);
53+
break;
54+
default:
55+
return bitmap;
56+
}
57+
58+
try {
59+
Bitmap oriented = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
60+
bitmap.recycle();
61+
return oriented;
62+
} catch (OutOfMemoryError e) {
63+
e.printStackTrace();
64+
return bitmap;
65+
}
66+
} catch (IOException e) {
67+
e.printStackTrace();
68+
}
69+
70+
return bitmap;
71+
}
72+
73+
public static int getExifOrientation(String src) throws IOException {
74+
int orientation = 1;
75+
76+
try {
77+
/**
78+
* if your are targeting only api level >= 5
79+
* ExifInterface exif = new ExifInterface(src);
80+
* orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
81+
*/
82+
if (Build.VERSION.SDK_INT >= 5) {
83+
Class<?> exifClass = Class.forName("android.media.ExifInterface");
84+
Constructor<?> exifConstructor = exifClass.getConstructor(new Class[]{String.class});
85+
Object exifInstance = exifConstructor.newInstance(new Object[]{src});
86+
Method getAttributeInt = exifClass.getMethod("getAttributeInt", new Class[]{String.class, int.class});
87+
Field tagOrientationField = exifClass.getField("TAG_ORIENTATION");
88+
String tagOrientation = (String) tagOrientationField.get(null);
89+
orientation = (Integer) getAttributeInt.invoke(exifInstance, new Object[]{tagOrientation, 1});
90+
}
91+
} catch (ClassNotFoundException e) {
92+
e.printStackTrace();
93+
} catch (SecurityException e) {
94+
e.printStackTrace();
95+
} catch (NoSuchMethodException e) {
96+
e.printStackTrace();
97+
} catch (IllegalArgumentException e) {
98+
e.printStackTrace();
99+
} catch (InstantiationException e) {
100+
e.printStackTrace();
101+
} catch (IllegalAccessException e) {
102+
e.printStackTrace();
103+
} catch (InvocationTargetException e) {
104+
e.printStackTrace();
105+
} catch (NoSuchFieldException e) {
106+
e.printStackTrace();
107+
}
108+
109+
return orientation;
110+
}
111+
}
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
package com.dhims.androidutils;
2+
3+
import android.annotation.SuppressLint;
4+
import android.content.ContentUris;
5+
import android.content.Context;
6+
import android.database.Cursor;
7+
import android.net.Uri;
8+
import android.os.Build;
9+
import android.os.Environment;
10+
import android.provider.DocumentsContract;
11+
import android.provider.MediaStore;
12+
import android.support.v4.content.ContextCompat;
13+
14+
import java.io.File;
15+
import java.io.IOException;
16+
import java.net.URISyntaxException;
17+
import java.util.ArrayList;
18+
import java.util.Collections;
19+
import java.util.List;
20+
21+
/**
22+
* Utility functions for handling path.
23+
*
24+
* @author Dhimant Desai ([email protected])
25+
*/
26+
public class PathUtil {
27+
/*
28+
* Gets the file path of the given Uri.
29+
*/
30+
@SuppressLint("NewApi")
31+
public static String getPath(Context context, Uri uri) throws URISyntaxException {
32+
final boolean needToCheckUri = Build.VERSION.SDK_INT >= 19;
33+
String selection = null;
34+
String[] selectionArgs = null;
35+
// Uri is different in versions after KITKAT (Android 4.4), we need to
36+
// deal with different Uris.
37+
if (needToCheckUri && DocumentsContract.isDocumentUri(context.getApplicationContext(), uri)) {
38+
if (isExternalStorageDocument(uri)) {
39+
final String docId = DocumentsContract.getDocumentId(uri);
40+
final String[] split = docId.split(":");
41+
final String type = split[0];
42+
if ("primary".equalsIgnoreCase(type)) {
43+
return Environment.getExternalStorageDirectory() + "/" + split[1];
44+
} else {
45+
File[] files = ContextCompat.getExternalFilesDirs(context, null);
46+
for (File file : files) {
47+
if (file.getAbsolutePath().contains(type)) {
48+
return file.getParentFile().getParentFile().getParentFile().getParentFile() + "/" + split[1];
49+
}
50+
}
51+
}
52+
} else if (isDownloadsDocument(uri)) {
53+
final String id = DocumentsContract.getDocumentId(uri);
54+
uri = ContentUris.withAppendedId(
55+
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
56+
} else if (isMediaDocument(uri)) {
57+
final String docId = DocumentsContract.getDocumentId(uri);
58+
final String[] split = docId.split(":");
59+
final String type = split[0];
60+
if ("image".equals(type)) {
61+
uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
62+
} else if ("video".equals(type)) {
63+
uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
64+
} else if ("audio".equals(type)) {
65+
uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
66+
}
67+
selection = "_id=?";
68+
selectionArgs = new String[]{split[1]};
69+
}
70+
}
71+
if ("content".equalsIgnoreCase(uri.getScheme())) {
72+
String[] projection = {MediaStore.Images.Media.DATA};
73+
Cursor cursor = null;
74+
try {
75+
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
76+
assert cursor != null;
77+
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
78+
if (cursor.moveToFirst()) {
79+
return cursor.getString(column_index);
80+
}
81+
} catch (Exception e) {
82+
}
83+
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
84+
return uri.getPath();
85+
}
86+
return null;
87+
}
88+
89+
/**
90+
* @param uri The Uri to check.
91+
* @return Whether the Uri authority is ExternalStorageProvider.
92+
*/
93+
private static boolean isExternalStorageDocument(Uri uri) {
94+
return "com.android.externalstorage.documents".equals(uri.getAuthority());
95+
}
96+
97+
/**
98+
* @param uri The Uri to check.
99+
* @return Whether the Uri authority is DownloadsProvider.
100+
*/
101+
private static boolean isDownloadsDocument(Uri uri) {
102+
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
103+
}
104+
105+
/**
106+
* @param uri The Uri to check.
107+
* @return Whether the Uri authority is MediaProvider.
108+
*/
109+
private static boolean isMediaDocument(Uri uri) {
110+
return "com.android.providers.media.documents".equals(uri.getAuthority());
111+
}
112+
113+
private static String getAppExternalDataDirectoryPath() {
114+
StringBuilder sb = new StringBuilder();
115+
sb.append(Environment.getExternalStorageDirectory())
116+
.append(File.separator)
117+
.append("Android")
118+
.append(File.separator)
119+
.append("data")
120+
.append(File.separator)
121+
.append("Package")
122+
.append(File.separator);
123+
124+
return sb.toString();
125+
}
126+
127+
private static File getAppExternalDataDirectoryFile() {
128+
File dataDirectoryFile = new File(getAppExternalDataDirectoryPath());
129+
dataDirectoryFile.mkdirs();
130+
131+
return dataDirectoryFile;
132+
}
133+
134+
public static File getTemporaryCameraFile() {
135+
File storageDir = new File(getAppExternalDataDirectoryFile(), "Camera");
136+
storageDir.mkdirs();
137+
File file = new File(storageDir, "CAMERA_" + System.currentTimeMillis() + ".jpg");
138+
try {
139+
file.createNewFile();
140+
} catch (IOException e) {
141+
e.printStackTrace();
142+
}
143+
return file;
144+
}
145+
146+
/**
147+
* @return Last Capture Camera Image Path
148+
*/
149+
public static File getLastUsedCameraFile() {
150+
File dataDir = new File(getAppExternalDataDirectoryFile(), "Camera");
151+
File[] files = dataDir.listFiles();
152+
List<File> filteredFiles = new ArrayList<>();
153+
for (File file : files) {
154+
if (file.getName().startsWith("CAMERA_")) {
155+
filteredFiles.add(file);
156+
}
157+
}
158+
159+
Collections.sort(filteredFiles);
160+
if (!filteredFiles.isEmpty()) {
161+
return filteredFiles.get(filteredFiles.size() - 1);
162+
} else {
163+
return null;
164+
}
165+
}
166+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.dhims.androidutils;
2+
3+
import android.app.Activity;
4+
import android.content.Intent;
5+
import android.content.pm.PackageManager;
6+
import android.net.Uri;
7+
import android.os.Build;
8+
import android.preference.PreferenceManager;
9+
import android.provider.Settings;
10+
import android.support.v4.app.Fragment;
11+
12+
/**
13+
* Utility functions for handling Permission.
14+
*
15+
* @author Dhimant Desai ([email protected])
16+
*/
17+
public class PermissionUtils {
18+
19+
public static boolean useRunTimePermissions() {
20+
return Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1;
21+
}
22+
23+
public static boolean hasPermission(Activity activity, String permission) {
24+
if (useRunTimePermissions()) {
25+
return activity.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
26+
}
27+
return true;
28+
}
29+
30+
public static void requestPermissions(Activity activity, String[] permission, int requestCode) {
31+
if (useRunTimePermissions()) {
32+
activity.requestPermissions(permission, requestCode);
33+
}
34+
}
35+
36+
public static void requestPermissions(Fragment fragment, String[] permission, int requestCode) {
37+
if (useRunTimePermissions()) {
38+
fragment.requestPermissions(permission, requestCode);
39+
}
40+
}
41+
42+
public static boolean shouldShowRational(Activity activity, String permission) {
43+
if (useRunTimePermissions()) {
44+
return activity.shouldShowRequestPermissionRationale(permission);
45+
}
46+
return false;
47+
}
48+
49+
public static boolean shouldAskForPermission(Activity activity, String permission) {
50+
if (useRunTimePermissions()) {
51+
return !hasPermission(activity, permission) &&
52+
(!hasAskedForPermission(activity, permission) ||
53+
shouldShowRational(activity, permission));
54+
}
55+
return false;
56+
}
57+
58+
public static void goToAppSettings(Activity activity) {
59+
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
60+
Uri.fromParts("package", activity.getPackageName(), null));
61+
intent.addCategory(Intent.CATEGORY_DEFAULT);
62+
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
63+
activity.startActivity(intent);
64+
}
65+
66+
public static boolean hasAskedForPermission(Activity activity, String permission) {
67+
return PreferenceManager
68+
.getDefaultSharedPreferences(activity)
69+
.getBoolean(permission, false);
70+
}
71+
72+
public static void markedPermissionAsAsked(Activity activity, String permission) {
73+
PreferenceManager
74+
.getDefaultSharedPreferences(activity)
75+
.edit()
76+
.putBoolean(permission, true)
77+
.apply();
78+
}
79+
}

0 commit comments

Comments
 (0)