在Android API 19及更高版本中,可以使用以下代码示例来解决在图像的DocumentsContract.getDocumentId
中没有类型的问题:
public String getImagePathFromUri(Context context, Uri uri) {
String imagePath = null;
if (DocumentsContract.isDocumentUri(context, uri)) {
// 如果是文档类型的URI
String documentId = DocumentsContract.getDocumentId(uri);
if (isMediaDocument(uri)) {
// MediaProvider
String[] split = documentId.split(":");
String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
String selection = "_id=?";
String[] selectionArgs = new String[]{split[1]};
imagePath = getDataColumn(context, contentUri, selection, selectionArgs);
} else if (isDownloadsDocument(uri)) {
// DownloadsProvider
if (documentId.startsWith("raw:")) {
imagePath = documentId.replaceFirst("raw:", "");
} else {
Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
imagePath = getDataColumn(context, contentUri, null, null);
}
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
// 如果是content类型的URI
imagePath = getDataColumn(context, uri, null, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
// 如果是file类型的URI
imagePath = uri.getPath();
}
return imagePath;
}
private String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = null;
String path = null;
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
path = cursor.getString(columnIndex);
}
} finally {
if (cursor != null) {
cursor.close();
}
}
return path;
}
private boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
private boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
这段代码使用了DocumentsContract
类来处理不同类型的URI,并通过查询MediaStore或DownloadsProvider来获取图像的路径。具体的处理流程如下:
DocumentsContract.isDocumentUri(context, uri)
方法来判断。DocumentsContract.getDocumentId(uri)
方法获取文档的ID。isMediaDocument(uri)
和isDownloadsDocument(uri)
方法来判断。documentId
获取类型和ID,并根据类型选择对应的contentUri
,然后使用getDataColumn()
方法查询MediaStore并获取图像路径。documentId
是否以"raw:"开头,如果是则直接使用该路径,否则根据documentId
构建对应的contentUri
,然后使用getDataColumn()
方法查询DownloadsProvider并获取图像路径。getDataColumn()
方法查询对应的内容提供器或直接获取文件路径。注意:以上代码仅适用于处理图像的路径,如果需要处理其他类型的文件路径,请相应地修改代码中的逻辑。