MP3プレーヤーを作成しようとしていますが、ImageViewにそれぞれの曲のアルバムアートを表示させたいです。以下を試しましたが、うまくいきません。
albumcover = (ImageView) findViewById(R.id.cover);
String coverPath = songsList.get(songIndex).get(MediaStore.Audio.Albums.ALBUM_ART);
Drawable img = Drawable.createFromPath(coverPath);
albumcover.setImageDrawable(img);
曲を再生しようとすると、ImageViewの空白の画面しか表示されません。
曲のアルバムアートを取得する方法は次のとおりです。
Cursor cursor = getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[] {MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
MediaStore.Audio.Albums._ID+ "=?",
new String[] {String.valueOf(albumId)},
null);
if (cursor.moveToFirst()) {
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
// do whatever you need to do
}
albumId
は、その曲のMediaStore.Audio.Media.ALBUM_ID
を指します。
ALBUM_ART
はMediaStore.Audio.Albums
のプロパティであるため、(アルバムのリストではなく)特定の曲のアルバムアートを探している場合は、2段階のプロセスです。曲のメタデータとして直接利用することはできません。
アルバムIDをお持ちの場合は、アルバム画像uriを取得します:-
final public static Uri sArtworkUri = Uri
.parse("content://media/external/audio/albumart");
Uri uri = ContentUris.withAppendedId(PlayerConstants.sArtworkUri,
listOfAlbums.get(position).getAlbumID());
そして、Image uriがある場合は、任意のイメージローダーを使用できます Glide 、 Picaso 、 [〜#〜 ] uil [〜#〜] 画像を表示します。
**OR**
あなたはあなた自身のイメージローダーを書くことができます
public Bitmap getAlbumart(Context context, Long album_id) {
Bitmap albumArtBitMap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
try {
final Uri sArtworkUri = Uri
.parse("content://media/external/audio/albumart");
Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);
ParcelFileDescriptor pfd = context.getContentResolver()
.openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfd.getFileDescriptor();
albumArtBitMap = BitmapFactory.decodeFileDescriptor(fd, null,
options);
pfd = null;
fd = null;
}
} catch (Error ee) {
} catch (Exception e) {
}
if (null != albumArtBitMap) {
return albumArtBitMap;
}
return getDefaultAlbumArtEfficiently(context.getResources());
}
public Bitmap getDefaultAlbumArtEfficiently(Resources resource) {
if (defaultBitmapArt == null) {
defaultBitmapArt = decodeSampledBitmapFromResource(resource,
R.drawable.default_album_art, UtilFunctions
.getUtilFunctions().dpToPixels(85, resource),
UtilFunctions.getUtilFunctions().dpToPixels(85, resource));
}
return defaultBitmapArt;
}
ContentResolver musicResolve = getContentResolver();
Uri smusicUri = Android.provider.MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
Cursor music =musicResolve.query(smusicUri,null //should use where clause(_ID==albumid)
,null, null, null);
music.moveToFirst(); //i put only one song in my external storage to keep things simple
int x=music.getColumnIndex(Android.provider.MediaStore.Audio.Albums.ALBUM_ART);
String thisArt = music.getString(x);
Bitmap bm= BitmapFactory.decodeFile(thisArt);
ImageView image=(ImageView)findViewById(R.id.image);
image.setImageBitmap(bm);
このメソッドは、曲のパスとアルバムアートを含むArrayListを返します。
public static ArrayList<CommonModel> getAllMusicPathList(Context context) {
ArrayList<CommonModel> musicPathArrList = new ArrayList<>();
Uri songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cursorAudio = context.getContentResolver().query(songUri, null, null, null, null);
if (cursorAudio != null && cursorAudio.moveToFirst()) {
Cursor cursorAlbum;
if (cursorAudio != null && cursorAudio.moveToFirst()) {
do {
Long albumId = Long.valueOf(cursorAudio.getString(cursorAudio.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)));
cursorAlbum = context.getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
MediaStore.Audio.Albums._ID + "=" + albumId, null, null);
if(cursorAlbum != null && cursorAlbum.moveToFirst()){
String albumCoverPath = cursorAlbum.getString(cursorAlbum.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
String data = cursorAudio.getString(cursorAudio.getColumnIndex(MediaStore.Audio.Media.DATA));
musicPathArrList.add(new CommonModel(data,albumCoverPath ,false));
}
} while (cursorAudio.moveToNext());
}
}
return musicPathArrList;
}
これはCommonModelです。
public class CommonModel {
private String path;
private boolean selected;
public String getAlbumCoverPath() {
return albumCoverPath;
}
public void setAlbumCoverPath(String albumCoverPath) {
this.albumCoverPath = albumCoverPath;
}
private String albumCoverPath;
public CommonModel(String path, String albumCoverPath, boolean b) {
this.path = path;
this.albumCoverPath=albumCoverPath;
this.selected=b;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public boolean getSelected() {
return selected;
}
public void setSelected(boolean selected) {
selected = selected;
}
}
サンプルコード
public static Uri getAlbumArtUri(long albumId) {
return ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), albumId);
}
ArrayList<Uri> albumArtUris = new ArrayList<>();
Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{"album_id"}, null, null, null);
cursor.moveToFirst();
do {
long ablumId = cursor.getLong(cursor.getColumnIndexOrThrow("album_id"));
albumArtUris.add(getAlbumArtUri(ablumId));
} while (cursor.moveToNext());
以下のコードは私のために働いた。私はそれがすでに答えられていることを知っています、それは誰かが参照をチェックするのに役立つかもしれません。
public void getAlbumArt() {
try {
ContentResolver cr = getContentResolver();
Uri uri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
Cursor cursor = cr.query(uri, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int albumart = cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART);
do {
String Albumids = cursor.getString(albumart);
Albumid.add(Albumids);
} while (cursor.moveToNext());
}cursor.close();
} catch (NumberFormatException e){
e.printStackTrace();
}
}
public void getSelectedPath(){
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String path= String.valueOf(listView.getItemAtPosition(i));
if(path.equals("null")){
ImageView imgv=(ImageView)view.findViewById(R.id.imageView);
imgv.setImageResource(R.drawable.unknowalbum);
imgv.setMaxHeight(50);
imgv.setMaxWidth(50);
}
else{
Drawable image=Drawable.createFromPath(path);
ImageView imgview=(ImageView)view.findViewById(R.id.imageView);
imgview.setImageDrawable(image);
}
}
});
}
完全なコード訪問については http://vasistaguru.blogspot.com/2017/02/get-albumart-and-trackname-using.html
Uri.parse( "content:// media/external/audio/albumart");を使用する必要があります。 albumartにクエリを実行します。最初の答えはいくつかの電話で例外を得るかもしれません(少なくとも私のもの)