package com.example.music; import java.util.ArrayList; import java.util.List; import com.example.adapter.MyAdapter; import com.example.bean.Music; import android.support.v7.app.ActionBarActivity; import android.database.Cursor; import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends ActionBarActivity { ListView list; List<Music> musicData; ArrayAdapter< String> adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); musicData=new ArrayList<Music>(); list=(ListView) findViewById(R.id.list); //5.适配器与activity相连 MyAdapter adapter=new MyAdapter(musicData, MainActivity.this); list.setAdapter(adapter); //1.获取cursor 对象得到查询内容 Cursor cursor =getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); //2.while 循环 遍历下一个条目 while (cursor.moveToNext()) { Music m=new Music(); String title=cursor.getString(cursor. getColumnIndex(MediaStore.Audio.Media.TITLE)); String singer=cursor.getString(cursor. getColumnIndex(MediaStore.Audio.Media.ARTIST)); if ("<unknow>".equals(singer)) { singer="未知艺术家"; } String album=cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.ALBUM)); long size=cursor.getLong(cursor .getColumnIndex(MediaStore.Audio.Media.SIZE)); long time=cursor.getLong(cursor .getColumnIndex(MediaStore.Audio.Media.DURATION)); String url=cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.DATA)); String name=cursor.getString(cursor .getColumnIndex(MediaStore .Audio.Media.DISPLAY_NAME)); String sbr=name.substring(name.length()-3,name.length()); if(sbr.equals("mp3")) { //3.得到文件的数据 m.setTitle(title); m.setSinger(singer); m.setAlbum(album); m.setsize(size); m.settime(time); m.setUrl(url); m.setName(name); //4.将内容添加到数据里 musicData.add(m); } }
cursor.close(); } }
MyAdapter
1 package com.example.adapter; 2 3 import java.util.List; 4 5 import com.example.bean.Music; 6 import com.example.music.R; 7 8 import android.content.Context; 9 import android.hardware.camera2.TotalCaptureResult; 10 import android.view.LayoutInflater; 11 import android.view.View; 12 import android.view.ViewGroup; 13 import android.widget.BaseAdapter; 14 import android.widget.TextView; 15 16 public class MyAdapter extends BaseAdapter { 17 18 private List<Music> musicdata; 19 private Context context; 20 public MyAdapter(List<Music> musicdata,Context context) { 21 this.musicdata=musicdata; 22 this.context=context; 23 } 24 @Override 25 public int getCount() { 26 // TODO Auto-generated method stub 27 return musicdata.size(); 28 } 29 30 @Override 31 public Object getItem(int position) { 32 // TODO Auto-generated method stub 33 return musicdata.get(position); 34 } 35 36 @Override 37 public long getItemId(int position) { 38 // TODO Auto-generated method stub 39 return position; 40 } 41 42 @Override 43 public View getView(int position, View convertView, ViewGroup parent) { 44 45 if (convertView==null) { 46 convertView=LayoutInflater.from(context).inflate(R.layout.list_item1,null); 47 48 } 49 Music m=musicdata.get(position); 50 TextView MusicName=(TextView) convertView.findViewById(R.id.name); 51 MusicName.setText(m.getName()); 52 TextView MusicSinger=(TextView) convertView.findViewById(R.id.singer); 53 MusicSinger.setText(m.getSinger()); 54 TextView MusicTime=(TextView) convertView.findViewById(R.id.musicTime); 55 MusicTime.setText(Time((int)m.gettime())); 56 return convertView; 57 }
//转换时间 58 public String Time(int time){ 59 time /=1000; 60 int minute=time/60; 61 int hour=minute/60; 62 int second=time%60; 63 minute %=60; 64 return String.format("%02d:%02d", minute,second); 65 66 67 } 68 69 }
具体步骤:
1.获取cursor 对象得到查询内容
1 Cursor cursor =getContentResolver().query( 2 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 3 null, 4 null, 5 null, 6 MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
2.while 循环 遍历下一个条目
1 Music m=new Music(); 2 3 String title=cursor.getString(cursor. 4 getColumnIndex(MediaStore.Audio.Media.TITLE)); 5 6 String singer=cursor.getString(cursor. 7 getColumnIndex(MediaStore.Audio.Media.ARTIST)); 8 9 10 11 if ("<unknow>".equals(singer)) { 12 singer="未知艺术家"; 13 14 } 15 String album=cursor.getString(cursor 16 .getColumnIndex(MediaStore.Audio.Media.ALBUM)); 17 18 long size=cursor.getLong(cursor 19 .getColumnIndex(MediaStore.Audio.Media.SIZE)); 20 long time=cursor.getLong(cursor 21 .getColumnIndex(MediaStore.Audio.Media.DURATION)); 22 String url=cursor.getString(cursor 23 .getColumnIndex(MediaStore.Audio.Media.DATA)); 24 String name=cursor.getString(cursor 25 .getColumnIndex(MediaStore 26 .Audio.Media.DISPLAY_NAME)); 27 String sbr=name.substring(name.length()-3,name.length()); 28
3.得到文件的数据
m.setTitle(title);
m.setSinger(singer);
m.setAlbum(album);
m.setsize(size);
m.settime(time);
m.setUrl(url);
m.setName(name);
4.将内容添加到数据里
1 musicData.add(m);
5.适配器与activity相连
1 MyAdapter adapter=new MyAdapter(musicData, MainActivity.this); 2 list.setAdapter(adapter);
写了这两篇博客关于qurey()的各个参数始终没解释现在解释一下
根据Android文档,
public final Cursor query (Uri uri, String[] projection,String selection,String[] selectionArgs, StringsortOrder)
第一个参数,uri,rui是什么呢?好吧,上面我们提到了Android提供内容的叫Provider,那么在Android中怎么区分各个Provider?有提供联系人的,有提供图片的等等。所以就需要有一个唯一的标识来标识这个Provider,Uri就是这个标识,android.provider.ContactsContract.Contacts.CONTENT_URI就是提供联系人的内容提供者,可惜这个内容提供者提供的数据很少。
第二个参数,projection,真不知道为什么要用这个单词,这个参数告诉Provider要返回的内容(列Column),比如Contacts Provider提供了联系人的ID和联系人的NAME等内容,如果我们只需要NAME,那么我们就应该使用:
1 Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI, 2 new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME}, null, null, null);
当然,下面打印的你就只能显示NAME了,因为你返回的结果不包含ID。用null表示返回Provider的所有内容(列Column)。
第三个参数,selection,设置条件,相当于SQL语句中的where。null表示不进行筛选。如果我们只想返回名称为张三的数据,第三个参数应该设置为:
1 Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI, 2 new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME}, 3 android.provider.ContactsContract.Contacts.DISPLAY_NAME + "='张三'", null, null);
结果:
- 11-05 15:30:32.188: I/System.out(10271): 张三
第四个参数,selectionArgs,这个参数是要配合第三个参数使用的,如果你在第三个参数里面有?,那么你在selectionArgs写的数据就会替换掉?,
1 Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI, 2 new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME}, 3 android.provider.ContactsContract.Contacts.DISPLAY_NAME + "=?", 4 new String[]{"张三"}, null);
效果和上面一句的效果一样。
第五个参数,sortOrder,按照什么进行排序,相当于SQL语句中的Order by。如果想要结果按照ID的降序排列:
1 Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI, 2 null, null,null, android.provider.ContactsContract.Contacts._ID + " DESC");
- 11-05 16:00:32.808: I/System.out(12523): 31
- 11-05 16:00:32.808: I/System.out(12523): 李四
- 11-05 16:00:32.817: I/System.out(12523): 13
- 11-05 16:00:32.817: I/System.out(12523): 张三
升序,其实默认排序是升序,+" ASC"写不写效果都一样:
1 Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI, 2 null, null,null, android.provider.ContactsContract.Contacts._ID + " ASC");
- 11-05 15:59:10.327: I/System.out(12406): 13
- 11-05 15:59:10.327: I/System.out(12406): 张三
- 11-05 15:59:10.327: I/System.out(12406): 31
- 11-05 15:59:10.327: I/System.out(12406): 李四
关于query的解释转自 http://blog.csdn.net/wssiqi/article/details/8132603
下面关于cursor的解释此处是部分解释
moveToLast()
移动光标到最后一行
moveToNext()
移动光标到下一行
moveToPosition(int position)
将光标移动到一个绝对的位置
moveToPrevious()
移动光标到上一行
MediaStore属性讲解
//获取歌曲在系统中的id
MediaStore.Audio.Media._ID
//获取歌曲的歌名
MediaStore.Audio.Media.TITLE;
//获取歌曲所在专辑的id
MediaStore.Audio.Media.ALBUM_ID;
//获取专辑的歌手名
MediaStore.Audio.Media.ARTIST
//获取歌曲的时长
MediaStore.Audio.Media.DURATION
//获取歌曲的大小
MediaStore.Audio.Media.SIZE
//获取专辑名
MediaStore.Audio.Media.ALBUM
//获取歌曲路径,如xx/xx/xx.mp3
ediaStore.Audio.Media.DATA
专辑信息
//获取专辑id
MediaStore.Audio.Albums._ID
//获取专辑名
MediaStore.Audio.Albums.ALBUM
//获取专辑歌手
MediaStore.Audio.Albums.ARTIST
//获取专辑歌曲数
MediaStore.Audio.Albums.NUMBER_OF_SONGS
歌手信息
//歌手id
MediaStore.Audio.Artists._ID
//歌手名
MediaStore.Audio.Artists.ARTIST
//歌手歌曲数
MediaStore.Audio.Artists.NUMBER_OF_TRACKS
文件夹
//查询歌曲信息
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
//查询专辑信息
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
//查询歌手信息
MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI;
//查询文件信息
MediaStore.Files.getContentUri("external");
下载链接
https://i.cnblogs.com/Files.aspx?order=1
此处不知道能不能看
云盘链接
链接:http://pan.baidu.com/s/1gftChTT 密码:6srn