contentprovider(第二篇)例子 获取多媒体文件,音乐播放器,query ,MediaStore

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);  

 

结果:

[java] view plaincopy
 
  1. 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");  

 

 
 
  1. 11-05 16:00:32.808: I/System.out(12523): 31  
  2. 11-05 16:00:32.808: I/System.out(12523): 李四  
  3. 11-05 16:00:32.817: I/System.out(12523): 13  
  4. 11-05 16:00:32.817: I/System.out(12523): 张三  

升序,其实默认排序是升序,+" ASC"写不写效果都一样:

 

 

[java] view plaincopy
 
1 Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,  
2                 null, null,null, android.provider.ContactsContract.Contacts._ID + " ASC");  

 

[java] view plaincopy
 
 
  1. 11-05 15:59:10.327: I/System.out(12406): 13  
  2. 11-05 15:59:10.327: I/System.out(12406): 张三  
  3. 11-05 15:59:10.327: I/System.out(12406): 31  
  4. 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

 

posted @ 2017-03-07 22:57  943987243  阅读(2414)  评论(0编辑  收藏  举报