Skip to content

Instantly share code, notes, and snippets.

@ozgurg
Forked from tatocaster/RealPathUtil.java
Created August 18, 2022 23:48
Show Gist options
  • Save ozgurg/0b1e96ea9fab441b946dc4896a7429c4 to your computer and use it in GitHub Desktop.
Save ozgurg/0b1e96ea9fab441b946dc4896a7429c4 to your computer and use it in GitHub Desktop.
Real Path Utility class for Android, works for all API
import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.loader.content.CursorLoader;
/**
* Real Path Utility class for Android.
* <p>
* Updated by @ozgurg
* <p>
* Source: https://gist.github.com/ImaginativeShohag/476a5ba87824f6e036f6bce10e229079
*/
@SuppressLint("ObsoleteSdkInt")
public class RealPathUtil {
public static String getRealPath(Context context, Uri fileUri) {
// SDK < API11
if (Build.VERSION.SDK_INT < 11) {
return getRealPathFromURI_BelowAPI11(context, fileUri);
}
// SDK >= 11 && SDK < 19
else if (Build.VERSION.SDK_INT < 19) {
return getRealPathFromURI_API11to18(context, fileUri);
}
// SDK > 19 (Android 4.4) and up
return getRealPathFromURI_API19(context, fileUri);
}
@SuppressLint("NewApi")
private static String getRealPathFromURI_API11to18(Context context, Uri contentUri) {
String[] projection = {MediaStore.Images.Media.DATA};
CursorLoader cursorLoader = new CursorLoader(context, contentUri, projection, null, null, null);
Cursor cursor = cursorLoader.loadInBackground();
if (cursor != null) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String result = cursor.getString(columnIndex);
cursor.close();
return result;
}
return null;
}
private static String getRealPathFromURI_BelowAPI11(@NonNull Context context, Uri contentUri) {
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = context.getContentResolver().query(contentUri, projection, null, null, null);
if (cursor != null) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String result = cursor.getString(columnIndex);
cursor.close();
return result;
}
return null;
}
@Nullable
@SuppressLint("NewApi")
private static String getRealPathFromURI_API19(Context context, Uri uri) {
boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
String docId = DocumentsContract.getDocumentId(uri);
String[] split = docId.split(":");
String type = split[0];
// This is for checking Main Memory
if ("primary".equalsIgnoreCase(type)) {
if (split.length > 1) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
} else {
return Environment.getExternalStorageDirectory() + "/";
}
// This is for checking SD Card
} else {
return "storage" + "/" + docId.replace(":", "/");
}
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
String fileName = getFilePath(context, uri);
if (fileName != null) {
return Environment.getExternalStorageDirectory().toString() + "/Download/" + fileName;
}
String id = DocumentsContract.getDocumentId(uri);
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.parseLong(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
String docId = DocumentsContract.getDocumentId(uri);
String[] split = docId.split(":");
String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
String selection = "_id=?";
String[] selectionArgs = new String[]{split[1]};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri)) {
return uri.getLastPathSegment();
}
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
@Nullable
private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
String column = "_data";
String[] projection = {column};
try (Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null)) {
if (cursor != null && cursor.moveToFirst()) {
int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
}
return null;
}
@Nullable
private static String getFilePath(Context context, Uri uri) {
String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME};
try (Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
int index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME);
return cursor.getString(index);
}
}
return null;
}
private static boolean isExternalStorageDocument(@NonNull Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
private static boolean isDownloadsDocument(@NonNull Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
private static boolean isMediaDocument(@NonNull Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
private static boolean isGooglePhotosUri(@NonNull Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment