動かざることバグの如し

近づきたいよ 君の理想に

ContentResolver+MediaStoreで音楽ファイルを読み込んでみる

こんな便利なクラスがあるなんて知らなかった(無知

とりあえず必要最低限の部分のみ実装してみる
外部SDの音楽ファイルを読み込み→ListViewでタイトルを一覧表示という流れ

まずはコンテントプロバイダ(ContentProvider)からデータを読み込む。そもそもContentProviderとは・・・・

ContentProviderは複数のアプリケーションでデータを共有するための仕組み

ContentProviderからデータを取得する « Tech Boosterから引用
だそうで。今回はあまり首を突っ込まないでおこう。普通ならこのデータベースを自分で作って色々やるんだろうけど、Androidでは音楽や画像のメディアやアドレス帳の情報などを共通データとしてコンテントプロバイダから取得可能とのこと。なるほど。
今回はこのコンテントプロバイダを利用して音楽の一覧を取得してみる。
そのためにはContentResolverクラスが必要になる。

ContentResolver cr = getApplicationContext().getContentResolver();

ContentResolver.queryで実際に取得。

Cursor cursor = cr.query(
	MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
	columns,
	null,
	null,
	null
);

このメソッドに必要な引数は5つあるが通常指定するのは最初の2つ。
第一引数MediaStore.Audio.Media.EXTERNAL_CONTENT_URIでSDカードに保存した音楽ファイルを取得できる。
他にも以下のように指定できる。

MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
SDカードに保存した音楽ファイル
MediaStore.Audio.Media.INTERNAL_CONTENT_URI
端末内部に保存した音楽ファイル
MediaStor.Images.Media.EXTERNAL_CONTENT_URI
SDカードに保存した画像ファイル
MediaStor.Images.Media.INTERNAL_CONTENT_URI
端末内部に保存した画像ファイル
MediaStor.Video.Media.EXTERNAL_CONTENT_URI
SDカードに保存した動画ファイル
MediaStor.Video.Media.INTERNAL_CONTENT_URI
端末内部に保存した動画ファイル

第二引数のcolumnsは取得したデータをどのように格納するのかを定義する感じ。変数使ったほうがスッキリすると思ったのでcolumns変数に宣言させた。

String[] columns = new String[]{
	MediaStore.Audio.Media._ID,
	MediaStore.Audio.Media.ARTIST,
	MediaStore.Audio.Media.ALBUM,
	MediaStore.Audio.Media.DURATION,
	MediaStore.Audio.Media.TRACK,
	MediaStore.Audio.Media.TITLE
};

残りのnull3つはフィルター条件(nullはフィルタリング無し)、フィルター用のパラメータ、ソートパラメータらしいけど特に指定がないのでnullで。
取得できたら以下を実行。

cursor.moveToFirst();

moveToFirstは別に要らないよって言ってる人もいるけど、これやらないと強制終了した。
あとはListViewに登録して表示させればおk.
こんな感じ

public class MainActivity extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		ContentResolver cr = getApplicationContext().getContentResolver();
		String[] columns = new String[]{
			MediaStore.Audio.Media._ID,
			MediaStore.Audio.Media.ARTIST,
			MediaStore.Audio.Media.ALBUM,
			MediaStore.Audio.Media.DURATION,
			MediaStore.Audio.Media.TRACK,
			MediaStore.Audio.Media.TITLE
		};
		Cursor cursor = cr.query(
			MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
			columns,
			null,
			null,
			null
		);
		cursor.moveToFirst();
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
		do{
			adapter.add(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)));
		}while(cursor.moveToNext());
		ListView listView = (ListView) findViewById(R.id.listView1);
		listView.setAdapter(adapter);
	}
}