ContentResolver - 如何从Uri获取文件名

问题描述 投票:11回答:4

我用startActivityForResult Intent打电话给ACTION_GET_CONTENT。一些应用程序使用此Uri返回数据:

内容://媒体/外部/图像/媒体/ 18122

我不知道它是图像,视频还是一些自定义内容。如何使用ContentResolver从此Uri获取实际文件名或内容标题?

android android-contentresolver
4个回答
14
投票

您可以通过修改投影从此代码或任何其他字段获取文件名

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;

15
投票

@ 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,因为我不确定它的区别。


1
投票

对于使用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)。


0
投票
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;
}

-2
投票

你可以使用Durairaj提出的解决方案作为投影数组:

String[] projection = { "_data" };
© www.soinside.com 2019 - 2024. All rights reserved.