MP3のジャケット画像の取得

MP3などの音声ファイルからはジャケット画像を取得することができます。

ジャケット画像のある場所とアクセス方法

Android端末では音声ファイルなどが追加されると自動でジャケット画像を取得してくれます。

では、どのようにしてその画像にアクセスするかというと次のURIにアクセスします。

content://media/external/audio/albumart

このURIの中に音声ファイルのジャケット画像が一括で保存されています。

このURIと画像のIDを組み合わせて次のようにジャケットを取得できます。

Uri albumArtUri = Uri.parse(
        "content://media/external/audio/albumart");
Uri album1Uri = ContentUris.withAppendedId(albumArtUri, albumId);
try{
    ContentResolver cr = getContentResolver();
    InputStream is = cr.openInputStream(album1Uri);
    Bitmap albumArt = BitmapFactory.decodeStream(is);
}catch(FileNotFoundException err){
    err.printStackTrace();
    }

この例ではalbumIdという変数にジャケット画像のIDが入っています。

ジャケット画像IDは音楽ファイル特有のものなので、もし音楽ファイルが削除されたりするとIDも変更されます。

このIDの取得の仕方については以下の例を見てください。

画像取得の例

次がSDカード内の音楽ファイルからジャケットを取得する例です。

コードは以下の通りです。

public class MainActivity extends Activity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ContentResolver cr = getContentResolver();
        
        Cursor cursor = cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                                    null, null, null, null);
            //SDカード内の音楽ファイルのすべてのメタデータを取得
        
        if(cursor != null){
            while(!cursor.isAfterLast()){

                int titleIndex =  cursor.getColumnIndex
                        (MediaStore.Audio.AudioColumns.TITLE);
                int albumDdIndex = cursor.getColumnIndex
                        (MediaStore.Audio.AudioColumns.ALBUM_ID);
                
                String title = cursor.getString(titleIndex);
                String albumIdStr = cursor.getString(albumDdIndex);
                long albumId = Long.parseLong(albumIdStr);
                Uri albumArtUri = Uri.parse(
                        "content://media/external/audio/albumart");
                Uri albumUri = ContentUris.withAppendedId(albumArtUri, albumId);
                    //ジャケット画像のURIを取得
                ContentResolver cr = getContentResolver();
                try{
                    InputStream is = cr.openInputStream(albumUri);
                    Bitmap album_art = BitmapFactory.decodeStream(is);
                        //URIからストリームを取得してそれを画像に変換
                }catch(FileNotFoundException e) {
                    //ストリームが開けなかったときの処理
                }
            }
        }
    }
}

ContentResolverクラスを使えば、画像のIDをタイトルや作者名などのメタデータと同様に取得できます。

あとはこの例のようにURIからストリームを開いて画像IDからパスを取得して画像を読み込むだけです。

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