Androidアプリ開発

音楽ファイルのジャケット画像を表示する

MP3 ファイルの ジャケット 画像を表示する
この記事は約9分で読めます。
記事内に広告が含まれています。
スポンサーリンク

こんにちは、まっさん(@Tera_Msaki)です。

この記事は Android スマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML 構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、
記事の最後で紹介します)

この記事のテーマ


 音楽ファイルにメタデータとして保存されている
 アルバムジャケットなどの画像ファイルを表示する


MP3ファイルなどの音楽ファイルには、アーティスト、アルバム名、ジャンルなどのメタデータが含まれています。
このメタデータのなかには、アルバムのジャケット画像が埋め込まれている場合があります。
今回は、音楽ファイルにメタデータとして格納されている画像ファイルを表示する方法について、説明したいと思います。

画像データが埋め込まれた音楽ファイル(ハイレゾ音源)のサンプルが無料でダウンロードできます↓↓↓

スマホ本体の音楽ファイルにアクセスする

スマホ本体に格納された音楽ファイルにアクセスする場合、コンテンツプロバイダを使用します。

コンテンツリゾルバ で音楽ファイルを抽出するクエリを実行し、音楽ファイルの格納先( URI )、音楽ファイル名、曲タイトル、アーティスト、再生時間を取得します。

  :
	private final Map<String, MusicItem> musicItemMap = new LinkedHashMap<>();
	:        
	ContentResolver resolver = context.getContentResolver();        
	Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, "IS_MUSIC != 0", null, "_ID DESC");        
	while (cursor.moveToNext()) {        
    	Uri contentUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,        
        	Long.parseLong(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID))));        
    	musicItemMap.put(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DISPLAY_NAME)),        
            new MusicItem(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)),        
            	cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)),        
                Long.parseLong(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DURATION))),        
                contentUri, cursor.getString(cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DISPLAY_NAME))));        
	}      
	:

後続の処理でハンドリングしやすいように、取得した結果でエンティティ( MusicItem )を生成し、音楽ファイル名をキーとした Map に格納しています。

◎MusicItem(エンティティクラス)

public class MusicItem {
    public String   title;      // タイトル
    public String   artist;     // アーティスト
    public long     duration;   // 再生時間
    public Uri      musicUri;   // 音楽ファイルUri
    public String   source;     // 音楽ファイル
    public MusicItem(String title, String artist, long duration, Uri musicUri, String source) {
        this.title    = title;
        this.artist   = artist;
        this.duration = duration;
        this.musicUri = musicUri;
        this.source   = source;
    }
}

音楽ファイルの画像ファイルを表示する

音楽ファイルのメタデータにアクセスする場合、MediaMetadataRetriever を使用します。

コンテンツリゾルバ で取得した音楽ファイルの格納先( URI )を使用して、MediaMetadataRetriever で音楽ファイルの画像データを取得します。
取得した画像データは、BitmapFactory でデコードしたものを、ImageView に表示しています。
画像データを取得できなかった場合は、drawable リソースに格納している画像を表示しています。

  :
	ImageView imageView = view.findViewById(R.id.image);
	MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
	mediaMetadataRetriever.setDataSource(context, musicItemList.get(position).musicUri);
	byte[] binary = mediaMetadataRetriever.getEmbeddedPicture();
	if (binary != null) {
    	imageView.setImageBitmap(BitmapFactory.decodeByteArray(binary, 0, binary.length));
	} else {
    	ContentResolver contentResolver = context.getContentResolver();
    	try {
        	InputStream inputStream = contentResolver.openInputStream(musicItemList.get(position).albumUri);
        	Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
       	imageView.setScaleType(CENTER_CROP);
        	imageView.setImageBitmap(bitmap);
    	} catch (FileNotFoundException e) {
        	imageView.setScaleType(CENTER_INSIDE);
        	imageView.setImageResource(R.drawable.no_image);
    	}
	}
  :

MediaMetadataRetriever で曲タイトル、アーティストなどの音楽ファイルのメータデータを直接参照することも可能です。

ContentResolverMediaMetadataRetriever は、
MP3以外の音楽ファイル形式(AAC、FLACなど)もハンドリングできます。

ジャケット画像の四隅を丸くする実装については、こちらです↓↓↓

音楽ファイルのジャケット画像を表示しているアプリは、こちらです↓↓↓