web-dev-qa-db-ja.com

ContentResolver-Uriからファイル名を取得する方法

startActivityForResult with IntentACTION_GET_CONTENT を呼び出します。一部のアプリはこれでデータを返します ri

content:// media/external/images/media/18122

それが画像なのかビデオなのか、それともカスタムコンテンツなのかわかりません。 ContentResolver を使用して、このURIから実際のファイル名またはコンテンツタイトルを取得するにはどうすればよいですか?

16
Pointer Null

このコード、またはプロジェクションを変更することで他のフィールドからファイル名を取得できます

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;
17

@Durairajの答えは、ファイルのpathを取得することに固有のものです。検索しているのがファイルの実際の名前である場合(コンテンツ解決を使用する必要があるため、その時点で多くのcontent:// 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を試してみることもできます。

18
Navarr

ファイル名を取得するには、新しい DocumentFile 形式を使用できます。

DocumentFile documentFile = DocumentFile.fromSingleUri(this, data.getdata());
String fileName = documentFile.getName();
5
cooldev

同じ問題を抱えている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

might例外をスローしますが、私にとってはこれまでに例外をスローしていません(URIが有効なcontent:// URIである限り)。

1
Leo Aso
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;
}
0
satyawan hajare