AndroidのMediaStoreから端末内の音楽ファイルのパスを取得してみる

RuuMusicはディレクトリで音楽を整理する音楽プレイヤーなわけですが、この取得の処理が結構重いんですよね。IOは結構ヘビー。 細かい改良ではどうにもならなそうなので、Android標準のMediaStoreとやらを使ってみることにしました。というか、使ってみようと思います。 ちなみにMediaStoreでファイルシステム上のパスを取得するのは想定されていないようなので、この方法はあんまりお勧めできません。自己責任でどうぞ。

とりあえず必要なものをインポート。

import android.content.ContentResolver;
import android.provider.MediaStore;
import android.database.Cursor;

import android.util.Log;

余談ですが、パッケージのFQNを書いてないandroid関連の記事って多くないですか。調べるのめんどいから勘弁してほしい…。

で、とりあえず情報を取得します。

ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);

リゾルバ作って、そいつに問い合わせ。わりとふつうのデータベースって感じです。 nullが並んでいるところでSQL風に色んな検索条件を指定できるので、いろいろ調べてみると幸せになれるかも。

取得できた項目の名前は以下のような感じで見れます。

for (String column: cursor.getColumnNames()) {
    Log.d("test", "column: " + column);
}

で、データを取得するには以下のような感じに。

cursor.moveToFirst();
do {
    Log.d("test", cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)));
} while(cursor.moveToNext());

ちょっと助長。この例だとタイトルの一覧を取得しています。 cursor.moveToFirstを忘れると例外が飛ぶので注意。

欲しいのはパスなわけですが、パスのカラム名は_dataになっています。非推奨な感じが漂っています。でも使います。

cursor.moveToFirst();
do {
    Log.d("test", cursor.getString(cursor.getColumnIndex("_data")));
} while(cursor.moveToNext());

これでファイルパスの一覧がログに出力されます。やったね。

それなりに高速に動くのでうれしいのだけれど、ちょっとめんどう。


参考: