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