音楽ファイルのメタデータの取り出し

メタデータとは画像や音楽ファイルなどに含まれる作曲者名や作成日時のような音楽以外の情報のことを言います。

音楽ファイルのメタデータを取得する一番楽な方法はシステムが収集した音楽を参照することです。

Androidでは端末の起動時に音楽ファイルを自動で検索してくれます。

それをアプリ中から取得するにはContentResolverクラスを使います。

サンプルコード

例えば、SDカード中の音楽のメタ情報を取得したい場合は次のようなコードを書きます。

public class MainActivity extends FragmentActivity 
{

    private final String LOG_TAG = "MainActivity : ";

    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setTheme(R.style.AppBaseTheme);
        setContentView(R.layout.activity_main);
        
        readMusicMetaData();
    }

    public void readMusicMetaData()
    {
                ContentResolver cr = this.getContentResolver();
        
        //読み込むメタ情報の設定
        String[] projection = new String[] 
        { 
            MediaStore.Audio.ArtistColumns.TITLE,
            MediaStore.Audio.ArtistColumns.ARTIST,
            MediaStore.Audio.AudioColumns.COMPOSER,
            MediaStore.Audio.AudioColumns.YEAR,
            MediaStore.Audio.AudioColumns.DURATION,
            MediaStore.Audio.AudioColumns.DATA,
            MediaStore.Audio.AudioColumns.DISPLAY_NAME
        };

        Cursor cursor = cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                                    projection, null, null, null);
            //SDカード内のすべての音楽ファイル情報を取得

        if(cursor == null){
            cursor.close();
        }
        
        cursor.moveToFirst();
        
        //Cursorインスタンスの中でのそれぞれのメタデータのインデックス番号を取得
        int title_index = cursor.getColumnIndex(
                MediaStore.Audio.AudioColumns.TITLE);
        int artist_index = cursor.getColumnIndex(
                MediaStore.Audio.ArtistColumns.ARTIST);
        int composer_index = cursor.getColumnIndex(
                MediaStore.Audio.AudioColumns.COMPOSER);
        int year_index = cursor.getColumnIndex(
                MediaStore.Audio.AudioColumns.YEAR);
        int time_index = cursor.getColumnIndex(
                MediaStore.Audio.AudioColumns.DURATION);
        int path_index = cursor.getColumnIndex(
                MediaStore.Audio.AudioColumns.DATA);
        int name_index = cursor.getColumnIndex(
                MediaStore.Audio.AudioColumns.DISPLAY_NAME);
        
        //音楽ファイルのメタデータを1つずつ読み取る。
        while(!cursor.isAfterLast()){
            Log.i(LOG_TAG, "曲名 : " + cursor.getString(title_index));
            Log.i(LOG_TAG, "作家 : " + cursor.getString(artist_index));
            Log.i(LOG_TAG, "作曲家 : " + cursor.getString(composer_index));
            Log.i(LOG_TAG, "作曲年 : " + cursor.getString(year_index));
            Log.i(LOG_TAG, "演奏時間(ミリ秒) : " + cursor.getString(time_index));
            Log.i(LOG_TAG, "ファイルパス  : " + cursor.getString(path_index));
            cursor.moveToNext();
                //次の音楽ファイルのメタ情報に進む。
        }
        
        cursor.close();
    }
}

この例ではprojectionというString配列が1つの音楽ファイルから読み込みたいメタデータの配列を示しています。

実際のメタデータはCursorインスタンスに格納されるので1つのメタ情報を読み込むには読み込みたいデータのインデックス番号をgetStringメソッドに渡します。

もし、SDカード内ではなく端末内の音楽ファイルの情報を取得したいならCursorインスタンスの取得部分を次のように書き換えます。

        Cursor cursor = cr.query(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,
                                    projection, null, null, null);

メタデータの文字化けについて

Android端末でメタデータを読み込む際は文字化けが発生することがあります。

なぜ文字化けが起きるかというと音楽ファイル側のタグの文字コードがshift_jisなどUTF8以外の文字コードで書かれているためです。

Androidの標準文字コードはUTF8なので変換できずに文字化けしてしまいます。

実際に文字化けが起こっているファイルをバイナリエディターなどで見るとshift_jisなどのUTF8以外の文字コードを使ってメタデータが書かれていることが分かります。

なので、もし文字化けしていたとしてもコードに問題があるわけではないので、メタデータをUTF8に書き換えれば元通りに読み込みできます。

関連項目
プライバシーポリシー