扫描本地音乐
关于 Cursor
Cursor 是每行的集合。
使用 moveToFirst() 定位第一行。 你必须知道每一列的名称。 你必须知道每一列的数据类型。
Cursor 是一个随机的数据源。 所有的数据都是通过下标取得。 关于 Cursor 的重要方法:
- close() 关闭游标,释放资源
- copyStringToBuffer(int columnIndex,CharArrayBuffer buffer) 在缓冲区中检索请求的列的文本,将将其存储
- getColumnCount()返回所有列的总数
- getColumnIndex(String columnName) 返回指定列的名称,如果不存在返回-1
- getColumnIndexOrThrow(String columnName) 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
- getColumnName(intcolumnIndex) 从给定的索引返回列名
- getColumnNames() 返回一个字符串数组的列名
- getCount()返回Cursor 中的行数
- moveToFirst() 移动光标到第一行
- moveToPosition(int position) 移动光标到一个绝对的位置
public List<Song> getLocalMusci(Context context) {
List<Song> list1 = new ArrayList<Song>();
int position = 0;
Cursor cursor = context.getContentResolver()
.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,MediaStore.Audio.AudioColumns.IS_MUSIC);
for (cursor.moveToFirst();!cursor.isAfterLast(); cursor.moveToNext()) {
Song song = new Song();
song.setSinger(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)));
song.setDuration(cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)));
song.setPath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));
song.setALLName(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)));
song.setSong(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)));
song.setSize(cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE)));
song.setId(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)));
if(song.getSong().contains("-")){
String Name[] = song.getSong().split("-");
String name = Name[1].toString().split(".mp3")[0].indexOf("[mqms2]") > 0
? Name[1].toString().split(".mp3")[0].substring(0, Name[1].toString().split(".mp3")[0].indexOf("[mqms2]")) : Name[1].toString().split(".mp3")[0];
song.setSong(name);
song.setSinger(Name[0]);
}
if (song.getDuration()/(1000 * 60) >= 1) { //只把1分钟以上的音乐添加到集合当中
song.setPosition(position);
list1.add(song);
Log.i("songsong","+"+song.getALLName()+song.getPath());
position++;
}
Log.i("getMUSIC","TTTTTTTTTTT3"+list1.size());
}
cursor.close();
if (list == null) {
list = list1;
}
return list1;
}
RecyclerView的使用
添加布局
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:id="@+id/rv_fragment_local"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
写item的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_song"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="人海 - 2015 版"
android:layout_marginTop="5dp"
android:layout_marginLeft="8dp"
android:textColor="#000000"
android:textSize="16sp"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginLeft="8dp">
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="6.0M" />
<TextView
android:id="@+id/tv_singer"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="燕池"
/>
</RelativeLayout>
<View
android:background="#e2dada"
android:layout_marginLeft="8dp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="3dp"/>
</LinearLayout>
写适配器
写一个MusicAdapter,在里面写一个MusicViewHolder 继承 RecyclerView.ViewHolder 会提供一个方法~用来绑定控件
public class MusicAdapter {
public class MusicViewHolder extends RecyclerView.ViewHolder {
public MusicViewHolder(View itemView) {
super(itemView);
}
}
}
然后让MusicAdapter继承RecyclerView.Adapter
public class MusicAdapter extends RecyclerView.Adapter<MusicAdapter.MusicViewHolder>{
List<Song> list;
private Context context;
public MusicAdapter (List<Song> list,Context context) {
this.list = list;
this.context = context;
}
@Override
public MusicViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MusicViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_music,parent,false));
}//绑定视图
@Override
public void onBindViewHolder(MusicViewHolder holder, int position) {
holder.load(list.get(position),context);
}
@Override
public int getItemCount() {
return list.size();
}
public class MusicViewHolder extends RecyclerView.ViewHolder{
TextView tvSong;
TextView tvSinger;
TextView tvSize;
public MusicViewHolder(View itemView) {
super(itemView);
tvSinger = itemView.findViewById(R.id.tv_singer);
tvSong = itemView.findViewById(R.id.tv_song);
tvSize = itemView.findViewById(R.id.tv_size);
}
public void load (final Song song, final Context context){
tvSinger.setText(song.getSinger());
tvSize.setText(convertFileSize(song.getSize()));
tvSong.setText(song.getSong());
if (song.getPath().equals(MusicUtil.getInstance().getPre())){
Log.i(TAG, "RED"+song.getPath()+MusicUtil.getInstance().getPre());
tvSize.setTextColor(Color.parseColor("#da3318"));
tvSinger.setTextColor(Color.parseColor("#da3318"));
tvSong.setTextColor(Color.parseColor("#da3318"));
}else{
tvSize.setTextColor(Color.parseColor("#959595"));
tvSinger.setTextColor(Color.parseColor("#959595"));
tvSong.setTextColor(Color.parseColor("#000000"));
}
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, com.music.activity.MusicActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("songInfo",song);
intent.putExtras(bundle);
context.startActivity(intent);
}
});
}
Activity中的代码
musicAdapter = new MusicAdapter(MusicUtil.getInstance().getLocalMusci(getActivity()));//将本地音乐的数据集合添加到适配器里面去
rvFragmentLocal.setLayoutManager(new LinearLayoutManager(getContext()));
rvFragmentLocal.setItemAnimator(new DefaultItemAnimator());//默认动画
rvFragmentLocal.setAdapter(musicAdapter);