今天继续昨天的内容,完成了音乐适配器的相关代码,增加了SD卡音乐信息的读取的学习和代码书写,并完成了手机SD本地音乐信息的导入。明天继续音乐的播放设置。
其中遇到了很多的问题,这里说一个最主要的问题(大佬帮助),在读取SD卡信息的时候出现了权限的问题,及时在manifest中增加了足够的权限,但是要把build.gradle改一下版本,我的从29改成了22,就可以了

package com.example.keeprunning6; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.ArrayList; public class LocalMusicAdapter extends BaseAdapter { private Context context; private LayoutInflater inflater; private ArrayList<LocalMusicBean>list; public LocalMusicAdapter(Context context,ArrayList<LocalMusicBean>list){ this.context=context; this.list=list; this.inflater=LayoutInflater.from(context); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } static class ViewHolder{ public TextView music_num,music_song,music_singer,music_album,music_durtion; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { convertView = inflater.inflate(R.layout.item_local_music, null); viewHolder = new ViewHolder(); viewHolder.music_num = convertView.findViewById(R.id.item_local_music_num); viewHolder.music_song=convertView.findViewById(R.id.item_local_music_song); viewHolder.music_singer=convertView.findViewById(R.id.item_local_music_singer); viewHolder.music_album=convertView.findViewById(R.id.item_local_music_album); viewHolder.music_durtion=convertView.findViewById(R.id.item_local_music_durtion); convertView.setTag(viewHolder); }else{ viewHolder=(ViewHolder)convertView.getTag(); } LocalMusicBean bean=list.get(position); viewHolder.music_num.setText((position+1)+""); viewHolder.music_song.setText(bean.getSong()); viewHolder.music_singer.setText(bean.getSinger()); viewHolder.music_album.setText(bean.getAlbum()); viewHolder.music_durtion.setText(bean.getDuration()); return convertView; } }

package com.example.keeprunning6; import android.Manifest; import android.content.ContentResolver; import android.content.pm.PackageManager; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; public class MainActivity extends AppCompatActivity { //音乐列表试图 private ListView listView; //音乐列表 private ArrayList<LocalMusicBean> list=new ArrayList<>(); //当前播放的音乐以及歌手 private TextView now_music_song,now_music_singer,now_music_duration,now_music_ablum; private LocalMusicAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView=findViewById(R.id.music_list); now_music_song=findViewById(R.id.local_music_botton_tv_song); now_music_singer=findViewById(R.id.item_local_music_singer); //自定义数据 adapter=new LocalMusicAdapter(MainActivity.this,list); listView.setAdapter(adapter); //加载本地数据源 localMusicData(); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //上面的position参数是歌曲在列表中的索引 //播放选中的音乐 //切换下方当前音乐信息 now_music_song.setText(list.get(position).getSong()); now_music_singer.setText(list.get(position).getSinger()); } }); } private void localMusicData(){ //加载本地存储当中的音乐mp3文件到集合当中 //1.获取ContentResolver对象 ContentResolver resolver=getContentResolver(); //2.获取本地音乐存储的Uri地址 Uri uri= MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; //3.开始查询地址 Cursor cursor=resolver.query(uri,null,null,null,null); //4.遍历Cursor int id=0; while(cursor.moveToNext()){ String song=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); String singer=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); String album=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); id++; //歌曲编号变成String类型 String sid=String.valueOf(id); String path=cursor.getString(cursor.getColumnIndex((MediaStore.Audio.Media.DATA))); // String duration=cursor.getString(cursor.getColumnIndex((MediaStore.Audio.Media.DURATION))); int duration=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)); SimpleDateFormat sdf=new SimpleDateFormat("mm:ss"); String time = formatTime(duration); //将一行当中的数据封装到对象当中 LocalMusicBean bean=new LocalMusicBean(sid,song,singer,album,time,path); list.add(bean); } //数据变化,提示适配器更新 adapter.notifyDataSetChanged(); } // 转换歌曲时间的格式 public static String formatTime(int time) { if (time / 1000 % 60 < 10) { String tt = time / 1000 / 60 + ":0" + time / 1000 % 60; return tt; } else { String tt = time / 1000 / 60 + ":" + time / 1000 % 60; return tt; } } }