下面列出了android.provider.DocumentsContract#getDocumentId ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@SuppressLint("NewApi")
public static String uriToPath(Context context, Uri uri) {
boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
Log.d("maxiee", "docID:" + docId);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = MediaStore.Images.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())){
return getDataColumn(context, uri, null, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
@Override
public String handleImageOnKitKat(Intent data) {
LogUtil.d(TAG, "handleImageOnkitKat");
String imagePath = null;
Uri uri = data.getData();
if (DocumentsContract.isDocumentUri(mSettingView.getSettingActivity().getApplicationContext(), uri)) {
//如果是document类型的Uri,则通过documentid处理
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docId.split(":")[1]; //解析出数字格式的id
String selection = MediaStore.Images.Media._ID + '=' + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contenUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
Long.valueOf(docId));
imagePath = getImagePath(contenUri, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
imagePath = getImagePath(uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
imagePath = uri.getPath();
}
return imagePath;
}
public static Uri prepareTreeUri(Uri treeUri) {
String documentId;
try {
documentId = DocumentsContract.getDocumentId(treeUri);
if (documentId == null) {
throw new IllegalArgumentException();
}
} catch (Exception e) {
// IllegalArgumentException will be raised
// if DocumentsContract.getDocumentId() failed.
// But it isn't mentioned the document,
// catch all kinds of Exception for safety.
documentId = DocumentsContract.getTreeDocumentId(treeUri);
}
return DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId);
}
/**
* 4.4以上的处理
*
* @param data
* @return
*/
@TargetApi(19)
private static String getPicOnKitKatAfter(Context context, Intent data) {
String imagePath = null;
Uri uri = data.getData();
if (DocumentsContract.isDocumentUri(context, uri)) {
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.provider.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(context, contentUri, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
imagePath = getImagePath(context, uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
imagePath = uri.getPath();
}
return imagePath;
}
/**
* 4.4以后
*
* @param data
*/
@SuppressLint("NewApi")
private void handleImageOnKitKat(Intent data) {
String imagePath = null;
Uri uri = data.getData();
Log.d("TAG", "handleImageOnKitKat: uri is " + uri);
if (DocumentsContract.isDocumentUri(this, uri)) {
// 如果是document类型的Uri,则通过document id处理
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docId.split(":")[1]; // 解析出数字格式的id
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(contentUri, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
// 如果是content类型的Uri,则使用普通方式处理
imagePath = getImagePath(uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
// 如果是file类型的Uri,直接获取图片路径即可
imagePath = uri.getPath();
}
displayImage(imagePath); // 根据图片路径显示图片
}
@TargetApi(19)
public static void handleImageOnKitKat(Activity activity, Intent data) {
Uri uri = data.getData();
if (DocumentsContract.isDocumentUri(activity, uri)) {
// 如果是document类型的Uri,则通过document id进行处理
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docId.split(":")[1]; // 解析出数字格式的id
String selection = MediaStore.Images.Media._ID + "=" + id;
albumPhotonUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("com.android.provides.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
Long.valueOf(docId));
albumPhotonUri = contentUri;
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
// 如果不是document类型的uri,则使用普通方式处理
albumPhotonUri = uri;
}
albumChooseZoom(activity, uri);
}
private static String getPicturePathFromUriAboveApi19(Context context, Uri uri) {
String filePath = null;
if (DocumentsContract.isDocumentUri(context, uri)) {
// 如果是document类型的 uri, 则通过document id来进行处理
String documentId = DocumentsContract.getDocumentId(uri);
if (isMediaDocument(uri)) { // MediaProvider
// 使用':'分割
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)) { // DownloadsProvider
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())) {
// 如果是 content 类型的 Uri
filePath = getDataColumn(context, uri, null, null);
} else if ("file".equals(uri.getScheme())) {
// 如果是 file 类型的 Uri,直接获取图片对应的路径
filePath = uri.getPath();
}
return filePath;
}
@Nullable public static String getPath(@NonNull Context context, @NonNull Uri uri) {
String filePath = null;
try {
String wholeID = DocumentsContract.getDocumentId(uri);
String id = wholeID.split(":")[1];
String[] column = {MediaStore.Images.Media.DATA};
String sel = MediaStore.Images.Media._ID + "=?";
try (Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
column, sel, new String[]{id}, null)) {
if (cursor != null) {
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
}
}
} catch (Exception ignored) {}
return filePath;
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private static String getKitKatPathFromMediaUri(Context context, Uri uri) {
String imagePath = "";
if (DocumentsContract.isDocumentUri(context, uri)) {
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
//Log.d(TAG, uri.toString());
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePathFromMediaUri(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
//Log.d(TAG, uri.toString());
Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"),
Long.valueOf(docId));
imagePath = getImagePathFromMediaUri(context, contentUri, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
//Log.d(TAG, "content: " + uri.toString());
imagePath = getImagePathFromMediaUri(context, uri, null);
}
return imagePath;
}
/**
* 适配api19以上,根据uri获取图片的绝对路径
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
private static String getRealPathFromUri_AboveApi19(Context context, Uri uri) {
String filePath = null;
String wholeID = DocumentsContract.getDocumentId(uri);
// 使用':'分割
String[] ids = wholeID.split(":");
String id = null;
if (ids == null) {
return null;
}
if (ids.length > 1) {
id = ids[1];
} else {
id = ids[0];
}
String[] projection = {MediaStore.Images.Media.DATA};
String selection = MediaStore.Images.Media._ID + "=?";
String[] selectionArgs = {id};
Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,//
projection, selection, selectionArgs, null);
int columnIndex = cursor.getColumnIndex(projection[0]);
if (cursor.moveToFirst()) filePath = cursor.getString(columnIndex);
cursor.close();
return filePath;
}
@TargetApi(Build.VERSION_CODES.KITKAT)
static String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
if (isKitKat && isMediaDocumentAuthority(uri)) {
final String documentId = DocumentsContract.getDocumentId(uri); // e.g. "image:1234"
final String[] parts = documentId.split(":");
final String type = parts[0];
final Uri contentUri;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else {
// reject video or audio documents
return null;
}
// query content resolver for MediaStore id column
final String selection = "_id=?";
final String[] args = new String[] {
parts[1]
};
return resolveFilePath(context, contentUri, selection, args);
} else if (isContentScheme(uri)) {
return resolveFilePath(context, uri, null, null);
} else if (isFileScheme(uri)) {
return uri.getPath();
}
return null;
}
@SuppressLint("NewApi")
public static String getRealPathFromURI_API19(Context context, Uri uri) {
String filePath = "";
try {
String wholeID = DocumentsContract.getDocumentId(uri);
// Split at colon, use second item in the array
String id = wholeID.indexOf(":") > -1 ? wholeID.split(":")[1] : wholeID.indexOf(";") > -1 ? wholeID
.split(";")[1] : wholeID;
String[] column = { MediaStore.Images.Media.DATA };
// where id is equal to
String sel = MediaStore.Images.Media._ID + "=?";
Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column,
sel, new String[] { id }, null);
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
cursor.close();
} catch (Exception e) {
filePath = "";
}
return filePath;
}
/**
* WARNING This is a tweak of internal Android code to make it faster by caching calls to queryIntentContentProviders
* Original (uncached) is DocumentFile.fromTreeUri
*/
@Nullable
private static DocumentFile fromTreeUriCached(@NonNull final Context context, @NonNull final Uri treeUri) {
String documentId = DocumentsContract.getTreeDocumentId(treeUri);
if (isDocumentUriCached(context, treeUri)) {
documentId = DocumentsContract.getDocumentId(treeUri);
}
return newTreeDocumentFile(null, context,
DocumentsContract.buildDocumentUriUsingTree(treeUri,
documentId));
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private static ImageFileInfo getImageInfo_API19(Context context, Uri uri) {
ImageFileInfo result = new ImageFileInfo();
String[] column = {MediaStore.Images.Media.DATA, MediaStore.Images.ImageColumns.ORIENTATION};
Cursor cursor = null;
try {
String wholeID = DocumentsContract.getDocumentId(uri);
String id = wholeID.split(":")[1];
String sel = MediaStore.Images.Media._ID + "=?";
cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
column, sel, new String[]{id}, null);
int pathIndex = cursor.getColumnIndex(column[0]);
int orientationIndex = cursor.getColumnIndex(column[1]);
if (cursor.moveToFirst()) {
if (pathIndex >= 0)
result.setFilePath(cursor.getString(pathIndex));
if (orientationIndex >= 0)
result.setOrientation(cursor.getInt(orientationIndex));
}
} catch (Exception e) {
Logger.e(e);
return null;
} finally {
if (cursor != null)
cursor.close();
}
return result;
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private static String getFilePathForExternalStorageDocumentUri(Uri uri) {
String documentId = DocumentsContract.getDocumentId(uri);
String[] split = documentId.split(":");
String uriContentType = split[0];
String uriId = split[1];
if ("primary".equalsIgnoreCase(uriContentType)) {
return Environment.getExternalStorageDirectory() + "/" + uriId;
} else {
return uri.getPath();
}
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private static String getFilePathForDownloadsDocumentUri(Context context, Uri uri) {
String documentId = DocumentsContract.getDocumentId(uri);
Uri downloadsContentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
return getDataColumnForContentUri(context, downloadsContentUri, null, null);
}
@TargetApi(Build.VERSION_CODES.KITKAT)
public static String getDocumentId(Uri uri) {
return DocumentsContract.getDocumentId(uri);
}
/**
* 从第三方文件选择器获取路径。
* 参见:http://blog.csdn.net/zbjdsbj/article/details/42387551
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public static String toPath(Context context, Uri uri) {
if (uri == null) {
return "";
}
String path = uri.getPath();
String scheme = uri.getScheme();
String authority = uri.getAuthority();
//是否是4.4及以上版本
boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
String docId = DocumentsContract.getDocumentId(uri);
String[] split = docId.split(":");
String type = split[0];
Uri contentUri = null;
switch (authority) {
// ExternalStorageProvider
case "com.android.externalstorage.documents":
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
break;
// DownloadsProvider
case "com.android.providers.downloads.documents":
contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
return _queryPathFromMediaStore(context, contentUri, null, null);
// MediaProvider
case "com.android.providers.media.documents":
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 _queryPathFromMediaStore(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else {
if ("content".equalsIgnoreCase(scheme)) {
// Return the remote address
if (authority.equals("com.google.android.apps.photos.content")) {
return uri.getLastPathSegment();
}
return _queryPathFromMediaStore(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(scheme)) {
return uri.getPath();
}
}
return path;
}
public static String getPath(Context context,
Uri uri) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (DocumentsContract.isDocumentUri(context, uri)) {
String docId;
String[] split;
String type;
if (isExternalStorageDocument(uri)) {
docId = DocumentsContract.getDocumentId(uri);
split = docId.split(":");
type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
} else {
if (isDownloadsDocument(uri)) {
docId = DocumentsContract.getDocumentId(uri);
Uri split1 = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
Long.valueOf(docId));
return getDataColumn(context,
split1,
null,
null);
}
if (isMediaDocument(uri)) {
docId = DocumentsContract.getDocumentId(uri);
split = docId.split(":");
type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
String selection = "_id=?";
String[] selectionArgs = new String[]{split[1]};
return getDataColumn(context,
contentUri,
"_id=?",
selectionArgs);
}
}
}
}
if ("content".equalsIgnoreCase(uri.getScheme())) {
if (isGooglePhotosUri(uri)) {
return uri.getLastPathSegment();
}
return getDataColumn(context,
uri,
null,
null);
}
if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
@SuppressLint("NewApi")
public static String getPath(Context context, Uri uri) throws URISyntaxException {
final boolean needToCheckUri = Build.VERSION.SDK_INT >= 19;
String selection = null;
String[] selectionArgs = null;
// Uri is different in versions after KITKAT (Android 4.4), we need to
// deal with different Uris.
if (needToCheckUri && DocumentsContract.isDocumentUri(context.getApplicationContext(), uri)) {
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
Log.d(App.PACKAGE_NAME, "uri get path from: " + uri.toString());
if (uri.toString().startsWith("content://com.android.externalstorage.documents/document/home%3A")) {
return Environment.getExternalStorageDirectory() + "/Documents/" + split[1];
} else {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
} else if (isDownloadsDocument(uri)) {
Log.w(App.PACKAGE_NAME, "files from magic downloads folder not supported");
/*
final String id = DocumentsContract.getDocumentId(uri);
uri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
*/
} else if (isMediaDocument(uri)) {
Log.w(App.PACKAGE_NAME, "files from magic media folder not supported");
/*
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("image".equals(type)) {
uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
selection = "_id=?";
selectionArgs = new String[]{ split[1] };
*/
}
}
return uri.getPath();
}