こんにちは、まっさん(@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 で曲タイトル、アーティストなどの音楽ファイルのメータデータを直接参照することも可能です。
ジャケット画像の四隅を丸くする実装については、こちらです↓↓↓
音楽ファイルのジャケット画像を表示しているアプリは、こちらです↓↓↓
ジャケット画像のメタデータがついた音楽ファイルをダウンロードするなら↓↓↓
今回は、ここまでです。
誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にあるコメントか、
こちらから、お願いいたします♪
ポチッとして頂けると、
次のコンテンツを作成する励みになります♪
これからAndroidのアプリ開発やJavaでの開発を始めたい方へ
初めての Android のアプリ開発では、アプリケーション開発経験がない方や、
アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、
かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。
未経験者からシステムエンジニアを目指すのに最適かと、
まずは無料相談から♪

未経験者からプログラマーを目指すのに最適かと、
まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています、
お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適かと、
まずは無料オンライン相談から♪

参考になったら、💛をポッチとしてね♪

 






コメント欄