package com.marverenic.music.utils;
import android.annotation.TargetApi;
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 android.provider.OpenableColumns;
import java.util.List;
public class UriUtils {
private static final String[] NAME_PROJECTION = {OpenableColumns.DISPLAY_NAME};
private static final String DOCUMENTS_AUTHORITY = "com.android.externalstorage.documents";
private static final String DOWNLOADS_AUTHORITY = "com.android.providers.downloads.documents";
private static final String MEDIA_AUTHORITY = "com.android.providers.media.documents";
public static String getDisplayName(Context context, Uri uri) {
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, NAME_PROJECTION, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int nameColumn = cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME);
String name = cursor.getString(nameColumn);
if (name.trim().isEmpty()) {
return getFileName(uri);
} else {
return name;
}
}
} finally {
if (cursor != null) {
cursor.close();
}
}
return getFileName(uri);
}
public static String getFileName(Uri uri) {
List<String> segments = uri.getPathSegments();
return (segments.isEmpty()) ? "" : segments.get(segments.size() - 1);
}
public static String getPathFromUri(Context context, Uri contentUri) {
if ("file".equals(contentUri.getScheme())) {
return contentUri.getPath();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
String docProviderPath = getPathFromDocumentProviderUri(context, contentUri);
if (docProviderPath != null && !docProviderPath.trim().isEmpty()) {
return docProviderPath;
}
}
if ("content".equals(contentUri.getScheme())) {
return getPathFromGeneralUri(context, contentUri);
}
return null;
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private static String getPathFromDocumentProviderUri(Context context, Uri uri) {
if (!DocumentsContract.isDocumentUri(context, uri)) {
return null;
}
if (DOCUMENTS_AUTHORITY.equals(uri.getAuthority())) {
// External storage provider
String docId = DocumentsContract.getDocumentId(uri);
String[] split = docId.split(":");
String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
} else {
return null;
}
} else if (DOWNLOADS_AUTHORITY.equals(uri.getAuthority())) {
// Downloads provider
String id = DocumentsContract.getDocumentId(uri);
Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getPathFromGeneralUri(context, contentUri);
} else if (MEDIA_AUTHORITY.equals(uri.getAuthority())) {
// Media Provider – assumes that only music URIs will be passed in
String id = DocumentsContract.getDocumentId(uri).split(":")[1];
return getPathFromMediaStore(context, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);
} else {
return null;
}
}
private static String getPathFromMediaStore(Context context, Uri uri, String id) {
String[] projection = {MediaStore.MediaColumns.DATA};
String selection = MediaStore.MediaColumns._ID + " = ?";
String[] selectionArgs = {id};
Cursor cur = context.getContentResolver().query(uri, projection, selection,
selectionArgs, null);
if (cur == null) {
return null;
}
String path = null;
if (cur.moveToFirst()) {
path = cur.getString(cur.getColumnIndex(MediaStore.MediaColumns.DATA));
}
cur.close();
return path;
}
private static String getPathFromGeneralUri(Context context, Uri uri) {
String[] projection = {MediaStore.MediaColumns.DATA};
Cursor cur = context.getContentResolver().query(uri, projection, null, null, null);
if (cur != null) {
cur.moveToFirst();
String result = cur.getString(cur.getColumnIndex(MediaStore.Audio.Media.DATA));
cur.close();
return result;
} else {
return null;
}
}
}