public
static
String getPath(
final
Context context,
final
Uri uri) {
final
boolean
isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
if
(isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
if
(isExternalStorageDocument(uri)) {
final
String docId = DocumentsContract.getDocumentId(uri);
final
String[] split = docId.split(
":"
);
final
String type = split[
0
];
if
(
"primary"
.equalsIgnoreCase(type)) {
return
Environment.getExternalStorageDirectory() +
"/"
+ split[
1
];
}
}
else
if
(isDownloadsDocument(uri)) {
final
String id = DocumentsContract.getDocumentId(uri);
final
Uri cOntentUri= ContentUris.withAppendedId(
Uri.parse(
"content://downloads/public_downloads"
), Long.valueOf(id));
return
getDataColumn(context, contentUri,
null
,
null
);
}
else
if
(isMediaDocument(uri)) {
final
String[] split = docId.split(
":"
);
final
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;
}
final
String selection =
"_id=?"
;
final
String[] selectiOnArgs=
new
String[] {
split[
1
]
};
return
getDataColumn(context, contentUri, selection, selectionArgs);
}
}
else
if
(
"content"
.equalsIgnoreCase(uri.getScheme())) {
if
(isGooglePhotosUri(uri))
return
uri.getLastPathSegment();
return
getDataColumn(context, uri,
null
,
null
);
}
else
if
(
"file"
.equalsIgnoreCase(uri.getScheme())) {
}
return
null
;
}
/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @param selection (Optional) Filter used in the query.
* @param selectionArgs (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
public
static
String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor =
null
;
final
String column =
"_data"
;
final
String[] projection = {
column
};
try
{
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null
);
if
(cursor !=
null
&& cursor.moveToFirst()) {
final
int
index = cursor.getColumnIndexOrThrow(column);
return
cursor.getString(index);
}
}
finally
{
if
(cursor !=
null
)
cursor.close();
}
return
null
;
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public
static
boolean
isExternalStorageDocument(Uri uri) {
return
"com.android.externalstorage.documents"
.equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public
static
boolean
isDownloadsDocument(Uri uri) {
return
"com.android.providers.downloads.documents"
.equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public
static
boolean
isMediaDocument(Uri uri) {
return
"com.android.providers.media.documents"
.equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public
static
boolean
isGooglePhotosUri(Uri uri) {
return
"com.google.android.apps.photos.content"
.equals(uri.getAuthority());
}