public class ImageFileUtil {
private static String imageCacheFile = "/image_cache";
@SuppressLint("ObsoleteSdkInt")
public static String getRealPathFromUri(Context context, Uri uri) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
return getRealPathFromUriAboveApiAndroidQ(context, uri);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
return getRealPathFromUriAboveApiAndroidK(context, uri);
} else {
return getRealPathFromUriBelowApiAndroidK(context, uri);
}
}
private static String getRealPathFromUriAboveApiAndroidQ(Context context, Uri uri) {
Cursor cursor = null;
String path = getRealPathFromUriAboveApiAndroidK(context, uri);
try {
cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=? ",
new String[]{path}, null);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
Uri baseUri = Uri.parse("content://media/external/images/media");
Uri uri2 = Uri.withAppendedPath(baseUri, "" + id);
int orientation = getOrientation(context, uri2);
return saveImagePath(context, getImageBit(context, uri2, orientation));
} else {
if (new File(path).exists()) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, path);
Uri uri2 = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
int orientation = getOrientation(context, uri2);
return saveImagePath(context, getImageBit(context, uri2, orientation));
} else {
return null;
}
}
} catch (Exception e) {
if (cursor != null)
cursor.close();
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
private static String getRealPathFromUriBelowApiAndroidK(Context context, Uri uri) {
return getDataColumn(context, uri, null, null);
}
@SuppressLint("NewApi")
private static String getRealPathFromUriAboveApiAndroidK(Context context, Uri uri) {
String filePath = null;
if (DocumentsContract.isDocumentUri(context, uri)) {
String documentId = DocumentsContract.getDocumentId(uri);
if (isMediaDocument(uri)) {
String id = documentId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=?";
String[] selectionArgs = {id};
filePath = getDataColumn(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);
} else if (isDownloadsDocument(uri)) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
filePath = getDataColumn(context, contentUri, null, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
filePath = getDataColumn(context, uri, null, null);
} else if ("file".equals(uri.getScheme())) {
filePath = uri.getPath();
}
return filePath;
}
private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
String path = null;
String[] projection = new String[]{MediaStore.Images.Media.DATA};
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
path = cursor.getString(columnIndex);
}
} catch (Exception e) {
if (cursor != null) {
cursor.close();
}
} finally {
if (cursor != null) {
cursor.close();
}
}
return path;
}
private static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
private static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
public static int getOrientation(Context context, Uri photoUri) {
int orientation = 0;
Cursor cursor = context.getContentResolver().query(photoUri,
new String[]{MediaStore.Images.ImageColumns.ORIENTATION}, null, null, null);
if (cursor != null) {
if (cursor.getCount() != 1) {
return -1;
}
cursor.moveToFirst();
orientation = cursor.getInt(0);
cursor.close();
}
return orientation;
}
public static Bitmap getImageBit(Context context, Uri imageUri, int orientation) {
ParcelFileDescriptor parcelFileDescriptor = null;
Bitmap bitmap = null;
try {
parcelFileDescriptor = context.getContentResolver().openFileDescriptor(imageUri, "r");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
parcelFileDescriptor.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
bitmap = changeBitmapOrientation(bitmap, orientation);
return bitmap;
}
private static Bitmap changeBitmapOrientation(Bitmap bitmap, int orientation) {
if (orientation != 0) {
Matrix matrix = new Matrix();
matrix.postRotate(orientation);
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
return bitmap;
}
public static String saveImagePath(Context context, Bitmap bitmap) {
File file = new File(context.getExternalCacheDir() + imageCacheFile);
if (!file.exists()) {
file.mkdir();
}
File imageFile = new File(file.getPath() + "/" + System.currentTimeMillis() + ".jpg");
try {
OutputStream os = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
os.flush();
os.close();
bitmap.recycle();
bitmap = null;
return imageFile.getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static boolean cleanImageCache(Context context) {
File file = new File(context.getExternalCacheDir().getPath() + imageCacheFile);
if (file.exists()) {
return file.delete();
}
return true;
}
}