-
-
Save ozgurg/0b1e96ea9fab441b946dc4896a7429c4 to your computer and use it in GitHub Desktop.
Real Path Utility class for Android, works for all API
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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