音乐数据未显示在RecyclerView中



我正在尝试在Android中制作音乐播放器,但在尝试获取所有媒体文件时无法检索和显示音乐数据。以下是我的代码

下面是歌曲模型类

package com.subhrajit.testmplayer;
import android.net.Uri;
import java.io.Serializable;
public class SongModel implements Serializable {
String trackTitle;
Uri uri;
Uri artWork;
double trackSize;
double trackDuration;
public SongModel(String trackTitle, Uri uri, Uri artWork, double trackSize, double trackDuration) {
this.trackTitle = trackTitle;
this.uri = uri;
this.artWork = artWork;
this.trackSize = trackSize;
this.trackDuration = trackDuration;
}
public String getTrackTitle() {
return trackTitle;
}
public void setTrackTitle(String trackTitle) {
this.trackTitle = trackTitle;
}
public Uri getUri() {
return uri;
}
public void setUri(Uri uri) {
this.uri = uri;
}
public Uri getArtWork() {
return artWork;
}
public void setArtWork(Uri artWork) {
this.artWork = artWork;
}
public double getTrackSize() {
return trackSize;
}
public void setTrackSize(double trackSize) {
this.trackSize = trackSize;
}
public double getTrackDuration() {
return trackDuration;
}
public void setTrackDuration(double trackDuration) {
this.trackDuration = trackDuration;
}
}

下面是歌曲适配器类

package com.subhrajit.testmplayer;
import android.content.Context;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.zip.Inflater;
public class AllSongsAdapter extends RecyclerView.Adapter<AllSongsAdapter.SongHolder> {
ArrayList<SongModel> allSongs;
Context context;
public AllSongsAdapter(ArrayList<SongModel> allSongs, Context context) {
this.allSongs = allSongs;
this.context = context;
}
@NonNull
@Override
public SongHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.all_songs_layout,parent,false);
return new SongHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SongHolder holder, int position) {
holder.songName.setText(allSongs.get(position).getTrackTitle());
holder.songSize.setText(String.valueOf(allSongs.get(position).getTrackSize()));
holder.songDuration.setText(String.valueOf(allSongs.get(position).getTrackDuration()));
//AlbumArt Setting
Uri artWorkURL= allSongs.get(position).getArtWork();
if (artWorkURL!=null){
holder.albumArt.setImageURI(artWorkURL);
}else if (holder.albumArt.getDrawable()==null){
holder.albumArt.setImageResource(R.drawable.default_albumart);
}
holder.itemView.setOnClickListener(v->{
Toast.makeText(context,allSongs.get(position).getTrackTitle()+" clicked!",Toast.LENGTH_LONG).show();
});
}
@Override
public int getItemCount() {
return (allSongs.size());
}
public class SongHolder extends RecyclerView.ViewHolder{
TextView songName,songDuration,songSize;
ImageView albumArt;
public SongHolder(@NonNull View itemView) {
super(itemView);
songName=itemView.findViewById(R.id.viewTrackName);
songDuration=itemView.findViewById(R.id.viewTrackDuration);
songSize=itemView.findViewById(R.id.viewTrackSize);
albumArt= itemView.findViewById(R.id.imgAlbumArt);
}
}
}

这是MainActivity类,我在其中加载所有媒体文件

package com.subhrajit.testmplayer;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.Manifest;
import android.content.ContentUris;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.Settings;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ArrayList<SongModel> allSongs=new ArrayList<>();
RecyclerView recyclerView;
AllSongsAdapter songAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!checkPermission()){
askPermission();
}
recyclerView=findViewById(R.id.recyclerView);
fetchAllTracks();
}
public void fetchAllTracks(){
Uri mediaStoreURI;
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.Q){
mediaStoreURI= MediaStore.Audio.Media.getContentUri(MediaStore.Audio.Media.VOLUME_NAME);
}else{
mediaStoreURI=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
//Define Projection
//String Projection List for DB Cursor
String[] projection={
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.SIZE,
MediaStore.Audio.Media.ALBUM_ID
};
//Defining Order
String sortOrder=MediaStore.Audio.Media.DATE_ADDED+"Desc";
//String selection=MediaStore.Audio.Media.IS_MUSIC+" !=0";
//getting songs
try(Cursor cursor=getContentResolver().query(mediaStoreURI,projection,null,null,sortOrder)){
//Saving cursor indices into local variables
int idColumn=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID);
int nameColumn=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
int durationColumn=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION);
int sizeColumn=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE);
int albumIDColumn=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID);
//Clear the previous loads before loading new
while(cursor.moveToNext()){
//Get the values of a column for a audio filE
long id=cursor.getLong(idColumn);
String name=cursor.getString(nameColumn);
double duration=cursor.getDouble(durationColumn);
double size= cursor.getDouble(sizeColumn);
long albumID=cursor.getLong(albumIDColumn);
//Song URI
Uri uri= ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,id);
//Album ArtWork URI
Uri albumArtWorkUri= ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"),albumID);
//Remove Extensions
name=name.substring(0,name.lastIndexOf("."));
SongModel song=new SongModel(name,uri,albumArtWorkUri,size,duration);
this.allSongs.add(song);
}
//display songs
showSongs(this.allSongs);
}catch (Exception ex){
ex.printStackTrace();
}
}
private void showSongs(ArrayList<SongModel> allSongs) {
if (allSongs.size()==0){
Toast.makeText(MainActivity.this,"No songs",Toast.LENGTH_LONG).show();
return;
}
allSongs.clear();
allSongs.addAll(allSongs);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
songAdapter=new AllSongsAdapter(allSongs,MainActivity.this);
recyclerView.setAdapter(songAdapter);
}
private boolean checkPermission(){
int result= ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
if (result== PackageManager.PERMISSION_GRANTED){
return true;
}else{
return false;
}
}
private void askPermission(){
//For Android 10 and below
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},100);
}
//For SDK 30 and Above Android 11 and above
}else if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.R){
if (!Environment.isExternalStorageManager()){
try{
Intent intent=new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.addCategory("DEFAULT");
intent.setData(Uri.parse(String.format("Package Name: %s",getApplicationContext().getPackageName())));
startActivityIfNeeded(intent,100);
}catch (Exception ex){
Intent intent = new Intent();
intent.setAction(Settings.ACTION_REQUEST_MANAGE_MEDIA);
startActivityIfNeeded(intent,100);
}
}
}
}
}

现在我正在上传布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardElevation="10dp"
app:cardCornerRadius="10dp"
app:layout_scrollEffect="compress"
app:cardBackgroundColor="@color/primary_color_variant"
android:layout_margin="7dp"
app:cardMaxElevation="12dp"
app:cardPreventCornerOverlap="true"
>
<RelativeLayout
android:layout_width="398dp"
android:layout_height="76dp"
android:layout_margin="5dp"
android:background="@color/black"
android:orientation="horizontal"
android:padding="7dp">
<ImageView
android:id="@+id/imgAlbumArt"
android:layout_width="68dp"
android:layout_height="62dp"
android:layout_marginEnd="10dp"
app:srcCompat="@drawable/default_albumart" />
<TextView
android:id="@+id/viewTrackName"
android:layout_width="282dp"
android:layout_height="38dp"
android:layout_toRightOf="@+id/imgAlbumArt"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:text="Song Title"
android:textColor="@color/cyan_text"
android:textSize="25dp"
android:textStyle="bold" />
<TextView
android:id="@+id/viewTrackDuration"
android:layout_width="148dp"
android:layout_height="31dp"
android:layout_below="@+id/viewTrackName"
android:layout_centerInParent="true"
android:layout_toRightOf="@+id/imgAlbumArt"
android:text="Song Duration"
android:textColor="@color/cyan_text"
android:textStyle="bold"
android:textSize="14dp" />
<TextView
android:id="@+id/viewTrackSize"
android:layout_width="118dp"
android:layout_height="31dp"
android:layout_toRightOf="@+id/viewTrackDuration"
android:layout_below="@+id/viewTrackName"
android:textColor="@color/cyan_text"
android:textStyle="bold"
android:textSize="14dp"
android:text="Song Size" />
</RelativeLayout>
</androidx.cardview.widget.CardView>

请求你帮助我。

光标查询出现问题。我把它改成下面这样,它像预期的一样工作

public ArrayList<Song>fetchAllSongs(Context context){
ArrayList<Song>tempAudioList=new ArrayList<>();
Uri uri=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[]projection={
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.ARTIST
};
Cursor cursor=context.getContentResolver().query(uri,projection,null,null,null);
if (cursor !=null){
while (cursor.moveToNext()){
String album=cursor.getString(0);
String title=cursor.getString(1);
String duration=cursor.getString(2);
String path=cursor.getString(3);
String artist=cursor.getString(4);
Log.e("PATH: "+path, "Album: "+album);
Song song=new Song(path,title,artist,album,duration);
tempAudioList.add(song);
}
cursor.close();
}
return tempAudioList;
}

最新更新