Androidアプリ開発

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

MP3 ファイルの ジャケット 画像を表示する
この記事は約8分で読めます。
スポンサーリンク

こんにちは、まっさん(@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など)もハンドリングできます。

ジャケット画像のメタデータがついた音楽ファイルをダウンロードするなら↓↓↓

今回は、ここまでです。

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちら
から、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

ブログランキング・にほんブログ村へ

これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

初めての Android のアプリ開発では、アプリケーション開発経験がない方や、
アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、
かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。

未経験者からシステムエンジニアを目指すのに最適かと、
まずは無料相談から♪

無料でJava言語を学べるのは、かなり魅力的♪
でも、応募資格は35歳以下です、、、
2022年12月から説明会が土曜日開催が追加されていますよ♪
説明会では、希望者に対してプログラミング体験もできるよ♪

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

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

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

コメント欄

タイトルとURLをコピーしました