ContentResolverとMediaStoreというクラスを使ったやり方。
ContentResolverは簡単にいうとAndroid端末のDBにアクセスするためのクラス(たぶん)。
SDカードや本体にアクセスして連絡先や画像、音楽ファイルなんかを検索できる。
Androidでは定期的にこういったファイルを検索しているらしいので、これにアクセスします。
んで、画像や音楽ファイル、動画なんかにアクセスするときに使うのがMediaStore。
とりあえず詳しい仕様はまだ調べてないので使い方だけ。
public class MusicList extends Activity {
private List<File> musics;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.answer_list);
ArrayAdapter<String> adapter
= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
musics = new ArrayList<File>();
ContentResolver cr = getApplicationContext().getContentResolver();
Cursor cursor = cr.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI , //データの種類
new String[]{
MediaStore.Audio.Media.ALBUM ,
MediaStore.Audio.Media.ARTIST ,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media._ID
} ,//取得する
null , //フィルター条件 nullはフィルタリング無し
null , //フィルター用のパラメータ
null //並べ替え
);
cursor.moveToFirst();
do{
adapter.add(cursor.getString(cursor.getColumnIndex( MediaStore.Audio.Media.TITLE)));
}while(cursor.moveToNext());
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
}
}
http://d.hatena.ne.jp/umezo/20100608/1276014215
ここを参考にさせてもらいました。
MediaStoreで指定すればアルバム情報やタイトルなどがもってこれるみたいです。
(何故かアルバムのジャケットはそんなコラムないってエラーになりました)
で、URI(上のMediaStore.Audio.Media.EXTERNAL_CONTENT_URI) + ID でファイルのURIを示すことに
なるそうなので、
MediaPlayer m = new MediaPlayer();
mp.setDataSource(getApplicationContext(),
Uri.withAppendedPath(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media._ID))
)
);
mp.prepare();
mp.start();
※例外処理は省く
のようにすれば再生もできます。
昨日は拡張子でフィルタリングしましたが、クエリの引数で指定すればフィルタもかけられるようですね。
MediaStoreを使うと音楽ファイルの詳細ももってこれるので楽曲リストつくったりするのに必須になりそうです。
MediaPlayerについてはそのうち書こうかな。
