startActivityForResult with IntentACTION_GET_CONTENT を呼び出します。一部のアプリはこれでデータを返します ri :
content:// media/external/images/media/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の答えは、ファイルの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
を試してみることもできます。
ファイル名を取得するには、新しい DocumentFile 形式を使用できます。
DocumentFile documentFile = DocumentFile.fromSingleUri(this, data.getdata());
String fileName = documentFile.getName();
同じ問題を抱えている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である限り)。
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;
}