安卓_獲取手機中的音樂播放

項目需求:

實現音樂播放器:播放本地音樂
功能:開始/播放/暫停/停止/上一首/下一首/進度條/播放模式的切換(單曲/隨機/順序)/播放完畢自動播放下一首

項目實現主要需要的類:
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;//地址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章