こんにちは、まっさん(@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 で曲タイトル、アーティストなどの音楽ファイルのメータデータを直接参照することも可能です。
ジャケット画像の四隅を丸くする実装については、こちらです↓↓↓
音楽ファイルのジャケット画像を表示しているアプリは、こちらです↓↓↓