Images
テーブルを照会してMediaStore.Images.Media.EXTERNAL_CONTENT_URI
ディレクトリ内のすべての画像を取得しています。私は結果のそれぞれに示すURIを持っているしたいのですが、今ContentResolver.query()からURIを取得
String[] what = new String[]{ MediaStore.Images.ImageColumns.DATE_TAKEN,
MediaStore.Images.ImageColumns._ID,
MediaStore.Images.ImageColumns.MIME_TYPE,
MediaStore.Images.ImageColumns.DATA };
String where = MediaStore.Images.Media.MIME_TYPE + "='image/jpeg'" +
" OR " + MediaStore.Images.Media.MIME_TYPE + "='image/png’";
Cursor cursor = getContext().getContentResolver()
.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
what,
where,
null,
MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC”);
:
は、次のクエリを参照してください。 これは私が今やっているものです:
int dataIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
String path = cursor.getString(dataIndex);
final Uri uri = Uri.fromFile(new File(path));
例えば、私はDATA
列からのパスを取る、ファイルを作成し、Uri.fromFile
を使用しています。私には2つの質問があります。
これは動作することは保証されていますか?上記のクエリは、データ列のパスを返すように保証されていますか?それは私の電話のすべての写真のために働きます:は常に
/storage/0/whatever.jpg
のようなパスであり、uri.toString()
はファイルスキームと同じです。それでも、画像はcontent:// urisによって非常によく定義できますが、画像テーブルにどのように表現されているか(そして、もしあれば)はわかりません。もしそうでない場合は、
DATA
の列で何を期待したらよいですか?それからUriを取得する方法は?
興味深いことに、ありがとうございます。 "使えないかもしれない部分"についてのただ一つのこと。私が理解しているように、あなたは私がこれらに対して新しいファイル(パス)を呼び出すことはできません。しかし、あなたが言ったように私がUriを構築すると、ContentResolver.open()を使ってアクセスできるようになりますか? – natario
UriはContentUri sで安全に構築されたものです(リムーバブルストレージの画像などのエッジケースでも機能します)。または、どこかに小切手を追加する必要がありますか? – natario
@mvai:READ_EXTERNAL_STORAGEを持っていればOKです。ただし、テストが推奨されます。私はまだ写真よりもビデオでもっと多くの作業をしてきましたが、そこに問題はないようです。最悪の場合の結果は、 'File'アプローチでのアクセスだけです。 – CommonsWare