我用startActivityForResult Intent打电话给ACTION_GET_CONTENT。一些应用程序使用此Uri返回数据:
内容://媒体/外部/图像/媒体/ 18122
我不知道它是图像,视频还是一些自定义内容。如何使用ContentResolver从此Uri获取实际文件名或内容标题?
您可以通过修改投影从此代码或任何其他字段获取文件名
String[] projection = {MediaStore.MediaColumns.DATA};
ContentResolver cr = getApplicationContext().getContentResolver();
Cursor metaCursor = cr.query(uri, projection, null, null, null);
if (metaCursor != null) {
try {
if (metaCursor.moveToFirst()) {
path = metaCursor.getString(0);
}
} finally {
metaCursor.close();
}
}
return path;
@ Durairaj的答案特定于获取文件的路径。如果您要搜索的是文件的实际名称(因为您应该使用内容解析,此时您可能会获得大量内容:// URI),您需要执行以下操作:
(代码从Durairaj的答案中复制并修改)
String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME};
Cursor metaCursor = cr.query(uri, projection, null, null, null);
if (metaCursor != null) {
try {
if (metaCursor.moveToFirst()) {
fileName = metaCursor.getString(0);
}
} finally {
metaCursor.close();
}
}
这里要注意的主要部分是我们正在使用MediaStore.MediaColumns.DISPLAY_NAME
,它返回内容的实际名称。您也可以尝试MediaStore.MediaColumns.TITLE
,因为我不确定它的区别。
对于使用Kotlin且遇到同样问题的任何人,您可以定义一个扩展方法,一次性获取文件名和大小(以字节为单位)。如果它无法检索字段,则返回null。
fun Uri.contentSchemeNameAndSize(): Pair<String, Int>? {
return contentResolver.query(this, null, null, null, null)?.use { cursor ->
if (!cursor.moveToFirst()) return@use null
val name = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
val size = cursor.getColumnIndex(OpenableColumns.SIZE)
cursor.getString(name) to cursor.getInt(size)
}
}
这样使用它
val nameAndSize = yourUri.contentNameAndSize()
// once you've confirmed that is not null, you can then do
val (name, size) = nameAndSize
它可能会引发异常,但它对我来说从未这样做过(只要URI是有效的content://
URI)。
private static String getRealPathFromURI(Context context, Uri contentUri)
{
String[] proj = { MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(context, contentUri, proj, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String result = cursor.getString(column_index);
cursor.close();
return result;
}
你可以使用Durairaj提出的解决方案作为投影数组:
String[] projection = { "_data" };