ContentProviderから音楽のAlbum_Artを取得したいのです。

2,069 views
Skip to first unread message

eryngii.mori

unread,
Jul 2, 2010, 7:01:39 AM7/2/10
to 日本Androidの会
いつも質問ばかりして申し訳ありません。
ContentProviderのMediaStore.Audio.Albums.EXTERNAL_CONTENT_URI または、
MediaStore.Audio.Media.EXTERNAL_CONTENT_URIから
音楽ファイルのAlbum_ART(音楽の表紙)を取得したいのですが参考になるサイトを教えていただけないでしょうか。
自分でも以下のように幾つか調べてみましたがあまりよくありません。

試した手順:

Intent intent = new
Intent(Intent.ACTION_PICK,MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_PICK_CONTACT);

で保存している音楽をIntentで指定して

protected void onActivityResult(int requestCode, int resultCode,
Intent returnedIntent) {
if (requestCode == REQUEST_PICK_CONTACT && resultCode ==
Activity.RESULT_OK) {
Uri uri = returnedIntent.getData();
Cursor personCursor = managedQuery(uri, null, null, null, null);
if (personCursor.moveToFirst()) {
int albumimageIndex =
personCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ART);
String albumart = personCursor.getString(albumimageIndex);
mAlbumImage.setText(albumart);
}
}
}

で、まず文字列を取得しようとしたのですがデバッガが起動してしまいます。
私の調べ方が悪いのでしょうか、どうすればAlbum_Artを取得できるのでしょうか教えてください。

飯塚康至

unread,
Jul 2, 2010, 8:04:32 PM7/2/10
to android-g...@googlegroups.com
こんにちは、飯塚です。

直接の答えではないのですが、デバッカの部分はブレイクポイントを設定してませんでしょうか。
http://www.stackasterisk.jp/tech/java/eclipseTips01_16.jsp
と思ってブレイクポイントをおいて起動してみましたが、普通に立ち上がってしまいました。

後、値の確認はLog.d()など使ってやってます。
画面に何か表示したいときはtoastを使ってますが、スレッドや内部クラスの中などで意外とはまるのでできるだけLog.d()でだしてます。

あと、蛇足ですが、Log.e()の中で、e.getMessage()とかやっていて、Nullで落ちたのは恥ずかしい過去。

2010年7月2日20:01 eryngii.mori <eryngi...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

--
以上、宜しくお願いします。

飯塚 康至

mosaki4

unread,
Jul 7, 2010, 10:42:19 AM7/7/10
to android-g...@googlegroups.com
大崎といいます、

全部調べてから投稿しようかと思ってましたがとりあえず分かったところだけ
文字の取得に関しては記述されているソースでほぼ合っているようです
違うのがおそらく ALBUM_ART が存在しない?
資料ではあるように見えますがバージョンが違うのか自分の環境(実機ht03-a)ではエラーがでるようです
ARTIST に変えたところアーティスト名の取得ができました。

検索結果の項目名一覧の取得は下記の通りです

//項目名の一覧を出力
Log.d( "TEST" , Arrays.toString( personCursor.getColumnNames() ) );

ブレイクポイントを設置してステップ実行することで
どこでエラーが起きているかが分かりますのでそれから原因を調査していけばいいでしょう

肝心の音楽の表紙の取得はまだ調査中・・・


2010年7月2日20:01 eryngii.mori <eryngi...@gmail.com>:

eryngii.mori

unread,
Jul 8, 2010, 5:48:13 AM7/8/10
to 日本Androidの会
私も幾つか試してみたのですが、文字情報は取得できます。
ただ、仮に考えられる問題点が以下の4つです。

1.URI形式でイメージ情報を返している。
2.イメージで返しているが表示するBitmapが用意していない。
3.そもそもイメージ情報を取り扱っていない。(キャッシュとしては扱っている)
4.イメージが存在しない

と考えているのですが、
LogCatで何らかの情報が確認して一つずつ潰して行きたいのですが方法が分からず途方にくれている状態です。
URIをStringで表示させる方法などがあればそれなりに対応できるのですが
本当にどうして良いか分からないです。

On 7月7日, 午後11:42, mosaki4 <mosa...@gmail.com> wrote:
> 大崎といいます、
>
> 全部調べてから投稿しようかと思ってましたがとりあえず分かったところだけ
> 文字の取得に関しては記述されているソースでほぼ合っているようです
> 違うのがおそらく ALBUM_ART が存在しない?
> 資料ではあるように見えますがバージョンが違うのか自分の環境(実機ht03-a)ではエラーがでるようです
> ARTIST に変えたところアーティスト名の取得ができました。
>
> 検索結果の項目名一覧の取得は下記の通りです
>
> //項目名の一覧を出力
> Log.d( "TEST" , Arrays.toString( personCursor.getColumnNames() ) );
>
> ブレイクポイントを設置してステップ実行することで
> どこでエラーが起きているかが分かりますのでそれから原因を調査していけばいいでしょう
>
> 肝心の音楽の表紙の取得はまだ調査中・・・
>
> 2010年7月2日20:01 eryngii.mori <eryngii.m...@gmail.com>:
> > このグループから退会するには、android-group-j...@googlegroups.com<android-group-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。

mosaki4

unread,
Sep 5, 2010, 2:40:50 AM9/5/10
to android-g...@googlegroups.com
大崎です、

この質問はいつか回答したいと思っていましたが
なかなか確実な情報が手に入りませんでした。
とりあえずある程度は分かったので記述します

下記のソースで「音楽ファイル」「アルバム画像ファイル」のファイルパスが取得できるので
あとは通常のSDカードからの再生・表示方法で利用できます。

ただ1点だけ問題が残っています
「アルバム画像ファイル」については、
おそらく画像ファイルの生成処理が別途必要になると思われます。

ht03a標準の音楽ソフトで一度再生させると
画像ファイルが生成されるようですが、
それ以前の場合は画像ファイルが表示されない


// 選択したファイルに関する情報を検索
Uri uri = returnedIntent.getData();
Cursor personCursor = managedQuery(uri, null, null, null, null);
if (personCursor.moveToFirst()) {

// アーティスト名
int artistIndex = personCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST);
String artist = personCursor.getString(artistIndex);

// アルバム名
int albumIndex = personCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM);
String album = personCursor.getString(albumIndex);

// 曲名
int titleIndex = personCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE);
String title = personCursor.getString(titleIndex);

// 音楽ファイル
int dataIndex = personCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
String data = personCursor.getString(dataIndex);
// アルバムID
int albumIdIndex = personCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID);
String albumId = personCursor.getString(albumIdIndex);

// アルバムIDと紐付くアルバム情報を検索
Cursor albumCursor = managedQuery(
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
null,
MediaStore.Audio.Albums._ID + "=?",
new String[]{ albumId },
null);
if (albumCursor.moveToFirst()){

// アルバム画像ファイル
int albumArtIndex = albumCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM_ART);
String albumArt = albumCursor.getString(albumArtIndex);

}
}


2010年7月2日20:01 eryngii.mori <eryngi...@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
Reply all
Reply to author
Forward
0 new messages