android - 无法同时获取专辑封面和专辑名称
问题描述
我正在尝试用专辑名称显示专辑封面。
如果我使用MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
,则重复专辑名称;但我可以展示专辑封面。
如果我使用MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI
,则不会重复专辑名称,但不会显示专辑封面。
如何使用专辑封面(如果有)获得不重复的专辑名称?
注意:我之前创建了一个歌曲列表,其中获取了歌曲名称、艺术家姓名、歌曲持续时间和专辑封面。但是我无法在“专辑”选项卡中使用相同的方法获取专辑名称和专辑封面(获取专辑封面或专辑名称)(我有四个选项卡用于歌曲、艺术家、专辑和播放列表)。
谢谢您的帮助。
这是代码:
相册.java
List<Album> sampleAlbum = new ArrayList<>();
public void getAlbum() {
ContentResolver contentResolver = getActivity().getContentResolver();
Uri songUri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
Cursor songCursor = contentResolver.query(songUri, null, null, null, null);
if (songCursor != null && songCursor.moveToFirst()) {
int songAlbum = songCursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM);
int songPath = songCursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART);
do {
Album newAlbum = new Album();
newAlbum.albumName = songCursor.getString(songAlbum);
newAlbum.pathName = songCursor.getString(songPath);
sampleAlbum.add(newAlbum);
}
while (songCursor.moveToNext());
}
}
AlbumRecyclerAdapter.java
public class AlbumRecyclerAdapter extends RecyclerView.Adapter<AlbumViewHolder> {
private List<Album> albums;
private Context context;
public AlbumRecyclerAdapter(Context context, List<Album> albums) {
this.albums = albums;
this.context = context;
}
@Override
public AlbumViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.album_recycler_item, parent, false);
return new AlbumViewHolder(view);
}
@Override
public void onBindViewHolder(AlbumViewHolder holder, final int position) {
final Album sampleAlbum = albums.get(position);
holder.album_name.setText(sampleAlbum.albumName);
try {
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(albums.get(position).pathName);
byte[] data = mmr.getEmbeddedPicture();
if (data != null) {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
holder.album_image.setImageBitmap(bitmap);
holder.album_image.setAdjustViewBounds(true);
holder.album_image.setLayoutParams(new LinearLayout.LayoutParams(500, 500));
}
else {
holder.album_image.setImageResource(R.drawable.default);
holder.album_image.setAdjustViewBounds(true);
holder.album_image.setLayoutParams(new LinearLayout.LayoutParams(500, 500));
}
}
catch (Exception e) {
e.printStackTrace();
}
holder.constraintLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "Album " + sampleAlbum.albumName + "'s songs will be opened", Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return albums.size();
}
}
解决方案
推荐阅读
- regex - 括号中的正则表达式
- r - 如何在 Shiny 中保存反应值?
- c# - 通过 Nlog C# 在单元测试中检查日志消息
- python-3.x - 使用 Paramiko 的基本 SSH 连接失败
- javascript - 当 React Jest 测试失败时,输出挂载的 DOM 的 HTML 的最佳方式是什么?
- c++ - 未来是否从 std::async 返回并带有析构函数中的 launch::deferred 策略块?
- r - R中的while循环,需要更高效的代码
- oracle - 如何忽略 oracle 中的选项卡/列不存在错误?
- javascript - Web 组件/模块和类继承
- r - 分类变量的频率表作为 R 中的数据框