安卓_获取手机中的音乐播放

项目需求:

实现音乐播放器:播放本地音乐
功能:开始/播放/暂停/停止/上一首/下一首/进度条/播放模式的切换(单曲/随机/顺序)/播放完毕自动播放下一首

项目实现主要需要的类:
MediaPlayer:主要可以实现音乐或者视频播放(播放视频需要结合SurfaceView来使用) 创建
MediaPlayer对象的两种方式:
(1)MediaPlayer mediaPlayer=new MediaPlayer();
(2)MediaPlayer.create(上下文Uri);

MediaPlayer播放视频,点击这里查看

MediaPlayer需要用到的方法有
void setDataSource(String path) :通过一个具体的路径来设置MediaPlayer的数据源,path可以是本地的一个路径,也可以是一个网络路径
void pause () 暂停
void start () 开始
void stop () 停止
void prepare() 同步的方式装载流媒体文件。
void prepareAsync() 异步的方式装载流媒体文件。
void reset() 重置MediaPlayer至未初始化状态。
void release () 回收流媒体资源。
void seekTo(int msec) 指定播放的位置(以毫秒为单位的时间)
int getCurrentPosition() 获取当前播放的位置
int getDuration() 得到文件的时间
boolean isLooping () 是否循环播放
boolean isPlaying() 是否正在播放
void setLooping(boolean looping) 设置是否单曲循环
setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 网络流媒体播放结束时回调
setOnErrorListener(MediaPlayer.OnErrorListener listener) 发生错误时回调 **
setOnPreparedListener(MediaPlayer.OnPreparedListener listener):当装载流媒体完毕的时候回调。

1.添加文件读写权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

2.首先封装一个自定义 音乐类

//封装好一个数据类
	private String song;//歌名
	private String singer;//歌名
	private String path;//歌曲

	public Music(String song, String singer, String path) {
    		this.song = song;
    		this.singer = singer;
    		this.path = path;
	}

3.从数据库中获取歌曲及信息,展示到ListView上面

	resolver = getContentResolver();//找到提供方
	Uri music = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;//获取音频
	String song = MediaStore.Video.Media.TITLE;//歌名
	String singer = MediaStore.Video.Media.ARTIST;//歌手
	String songLength = MediaStore.Video.Media.DURATION;//总时长
	String songPath = MediaStore.Video.Media.DATA;//地址

	Cursor query = resolver.query(music, null, null, null, null, null);
	while (query.moveToNext()){
  	  String querySong = query.getString(query.getColumnIndex(song));
 	   String querydata =query.getString(query.getColumnIndex(songPath));
 	   musics.add(new MyMusic(querydata,querySong));
 	   list.add(querySong);
	}

4.给listView设置item点击事件执行

//点击单行执行播放
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            try {
                playMusic(position);
            } catch (IOException e) {
                e.printStackTrace();
            }

    }
});

//播放方法

public void playMusic(int position) throws IOException {
    if(player==null){//如果为空创建对象,保证只有一个MediaPalyer对象
        player=new MediaPlayer();
    }
    //重置
    player.reset();
    //新设置资源
    player.setDataSource(this,Uri.parse(musics.get(position).data));
    player.prepare();//准备
    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {//准备监听播放完毕
        @Override
        public void onPrepared(MediaPlayer mp) {
            player.start();
            //设置进度条的最大值为歌的总时长
            seekBar.setMax(player.getDuration());
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                	 //获得歌的进度
                    int currentPosition = player.getCurrentPosition();
                    //为进度条设置
                    seekBar.setProgress(currentPosition);
                }
            },0,500);
        }
    });
    //设置播放完毕的监听
    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            next();
        }
    });
    //更新下标
    cur_position=position;
}

5.SeekBar的监听 拖拽改变进度

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    //改变
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    }
    //开始
    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    }
    //停止
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
    	   //获取拖拽的进度
        int progress = seekBar.getProgress();
        //设置播放的进度
        player.seekTo(progress);

    }
});

6.用户的操作功能

//开始
public  void  start(){
    if(player!=null){
        player.start();
    }
}
//暂停
public void pause(){
    if(player!=null){
        player.pause();
    }


}
//停止
public void stop(){
    if(player!=null){
        player.stop();
    }

}
//上一首
public void pre(){
    if(cur_position==0){
        cur_position=list.size()-1;
    }else{
        cur_position--;
    }
    try {
        playMusic(cur_position);
    } catch (IOException e) {
        e.printStackTrace();
    }

}

//下一首
public void next(){
    if(cur_position==list.size()-1){
        cur_position=0;
    }else{
        cur_position++;
    }
    try {
        playMusic(cur_position);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

大概的实现效果

安卓_获取手机中的音乐播放

其他系统权限及Uri,敬请参考

mission android:name="android.permission.READ_SMS" />
	Uri msg =Telephony.Sms.CONTENT_URI;//手机短信库
	String msgPath=Telephony.Sms.ADDRESS; //地址
	String text =Telephony.Sms.BODY; //内容

	//获取手机联系人 权限:<uses-permission android:name="android.permission.READ_CONTACTS" />
	Uri uri= ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
	String name=ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME;//姓名
	String phoneNamber=ContactsContract.CommonDataKinds.Phone.NUMBER;//电话


	//获取音频视频 因为视频音频一般存在默认的公开文件夹下 所以要添加文件读写的权限
	//<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	//<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
	Uri vidio = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;//获取视频
	Uri music = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;//获取音频
	String song = MediaStore.Video.Media.TITLE;//歌名
	String singer = MediaStore.Video.Media.ARTIST;//歌手
	String songLength = MediaStore.Video.Media.DURATION;//总时长
	String songPath = MediaStore.Video.Media.DATA;//地址

	//获取手机图库 权限同上
	Uri imgs = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;//获取图库的Uri
	String imgName = MediaStore.Images.Media.TITLE;//图片名称
	String size = MediaStore.Images.Media.SIZE;//大小
	String imgPath = MediaStore.Images.Media.DATA;//地址