加载媒体库里的音频

Posted 钱大少丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加载媒体库里的音频相关的知识,希望对你有一定的参考价值。

 /*加载媒体库里的音频*/
    public ArrayList<MusicMedia> scanAllAudioFiles(){
        //生成动态数组,并且转载数据
        ArrayList<MusicMedia> mylist = new ArrayList<MusicMedia>();

        /*查询媒体数据库
        参数分别为(路径,要查询的列名,条件语句,条件参数,排序)
        视频:MediaStore.Video.Media.EXTERNAL_CONTENT_URI
        图片;MediaStore.Images.Media.EXTERNAL_CONTENT_URI

         */
        Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
        //遍历媒体数据库
        if(cursor.moveToFirst()){
            while (!cursor.isAfterLast()) {
                //歌曲编号
                int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
                //歌曲标题
                String tilte = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
                //歌曲的专辑名:MediaStore.Audio.Media.ALBUM
                String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
                int albumId = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
                //歌曲的歌手名: MediaStore.Audio.Media.ARTIST
                String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
                //歌曲文件的路径 :MediaStore.Audio.Media.DATA
                String url = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
                //歌曲的总播放时长 :MediaStore.Audio.Media.DURATION
                int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
                //歌曲文件的大小 :MediaStore.Audio.Media.SIZE
                Long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));


                if (size >1024*800){//大于800K
                    MusicMedia musicMedia = new MusicMedia();
                    musicMedia.setId(id);
                    musicMedia.setArtist(artist);
                    musicMedia.setSize(size);
                    musicMedia.setTitle(tilte);
                    musicMedia.setTime(duration);
                    musicMedia.setUrl(url);
                    musicMedia.setAlbum(album);
                    musicMedia.setAlbumId(albumId);

                    mylist.add(musicMedia);

                }
                cursor.moveToNext();
            }
        }
        return mylist;
    }

 

 

  主函数

//播放对象
private MediaPlayer mediaPlayer;
//当前播放的索引
private int currentListItem=0;
private Adapter adapter;
private ListView listView;


private Button pause;
private Button next;
private Button last;
private ArrayList<MusicMedia> musicMedias;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mediaPlayer=new MediaPlayer();
    initView();
    musiclist();

}

private void musiclist() {

  adapter=new Adapter(musicMedias,this);
  listView.setAdapter(adapter);
  listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    currentListItem = i;
    mediaPlayer = MediaPlayer.create(MainActivity.this, Uri.parse(musicMedias.get(i).getUrl()));
    mediaPlayer.start();
}
});
}


private void initView() {
    pause = (Button) findViewById(R.id.pause);
    next = (Button) findViewById(R.id.next);
    last = (Button) findViewById(R.id.last);
    listView= (ListView) findViewById(R.id.lv);
    musicMedias = scanAllAudioFiles();
    pause.setOnClickListener(this);
    next.setOnClickListener(this);
    last.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.pause:
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.pause();
                }else{
                    mediaPlayer.start();
                }
            break;
        case R.id.next:
            try {
                nextMusic();
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
        case R.id.last:
            try {
                lastMusic();
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
    }
}



//下一首
private void nextMusic() throws IOException {
    if (++currentListItem>=musicMedias.size()){
        currentListItem=0;
    }
    mediaPlayer.reset();
    mediaPlayer.setDataSource(musicMedias.get(currentListItem).getUrl());
    mediaPlayer.prepare();
    mediaPlayer.start();

}
//上一首
private void lastMusic() throws IOException {

        if (--currentListItem<=0){
            currentListItem=musicMedias.size()-1;
        }
    mediaPlayer.reset();
    mediaPlayer .setDataSource(musicMedias.get(currentListItem).getUrl());
    mediaPlayer.prepare();
    mediaPlayer.start();

}

 

以上是关于加载媒体库里的音频的主要内容,如果未能解决你的问题,请参考以下文章

使用主播放列表时,HLS.js 一次加载所有子片段

媒体基础视频重新编码产生音频流同步偏移

内容提供者——获取媒体库里面的图片

Java mp4parser 片段序列不连续

片段中的媒体控制器

关于在各浏览器中插入音频文件的html代码片段