Android入門教程 MediaPlayer教程【使用進度條】
阿新 • • 發佈:2019-01-04
目標:獲取手機中的歌曲,並使用MediaPlayer播放歌曲
第一步:建立介面卡控制元件
第二步:建立介面卡
第三步:繫結介面卡
第四步:為MediaPlayer建立播放、暫停、上一曲、下一曲、停止方法
第五步:使用Thread和SeekBar實現進度條
MainActivity
public class MainActivity extends Activity {
private ListView musicListView;
// 資源獲取器
private ContentResolver resolver;
private List<MusicVO> musicList = new ArrayList<MusicVO>();
private MediaPlayer mediaPlayer;
private int currentPosition;
private Button pre;
private Button next;
private Button play;
private Button stop;
private SeekBar seekbar;
private Thread thread;
//執行緒標誌位
private boolean isStop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 例項化listview
musicListView = (ListView) findViewById(R.id.musiclistview);
// 初始化資料
initData();
// 建立介面卡
MusicAdapter adapter = new MusicAdapter(this, musicList);
// 繫結介面卡
musicListView.setAdapter(adapter);
// 例項化MediaPlayer
mediaPlayer = new MediaPlayer();
// 設定點選事件
musicListView.setOnItemClickListener(new OnItemClickListener() {
// parent--父檢視
// view——當前點選的View
// position——當前點選的位置
// id——當前點選項的ID
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
currentPosition = position;
play();
play.setText("暫停");
}
});
initView();
seekbar = (SeekBar) findViewById(R.id.seekbar);
}
private void initView() {
pre = (Button) findViewById(R.id.prebtn);
next = (Button) findViewById(R.id.nextbtn);
play = (Button) findViewById(R.id.playbtn);
stop = (Button) findViewById(R.id.stopbtn);
// 上一曲
pre.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
previous();
}
});
// 下一曲
next.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
next();
}
});
// 播放
play.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()) {
// 如果正在播放,則暫停,並把按鈕上的文字設定成“播放”
mediaPlayer.pause();
play.setText("播放");
} else {
// 如果已暫停,則播放,並把按鈕上的文字設定成“暫停”
mediaPlayer.start();
play.setText("暫停");
}
}
});
// 停止
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.stop();
play.setText("播放");
// 設定進度條歸零
seekbar.setProgress(0);
//執行緒標誌位,執行緒停止
isStop = true;
}
});
}
/**
* 初始化資料,獲取手機中的音樂檔案,並新增至list列表中
*/
private void initData() {
// 建立ContentResolver
resolver = getContentResolver();
// 建立遊標
Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null,
null, null);
// 把游標移到第一位
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
// 獲取歌曲名字
String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
// 獲取歌手名字
String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
// 獲取歌曲的路徑
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
// 新建一個MusicVO物件
MusicVO music = new MusicVO();
music.setName(name);
music.setSinger(singer);
music.setPath(path);
musicList.add(music);
//遊標下移
cursor.moveToNext();
}
// 關閉遊標,釋放資源
cursor.close();
}
/**
* 播放
*/
private void play() {
isStop = false;
try {
// 重置
mediaPlayer.reset();
// 設定音樂播放源
mediaPlayer.setDataSource(musicList.get(currentPosition).getPath());
// 準備
mediaPlayer.prepare();
// 啟動
mediaPlayer.start();
// 設定播放結束後自動迴圈播放
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
next();
}
});
// 設定seekbar的最大值
seekbar.setMax(mediaPlayer.getDuration());
// 建立一個執行緒
thread = new Thread(new SeekBarThread());
// 啟動執行緒
thread.start();
} catch (IllegalArgumentException | SecurityException | IllegalStateException
| IOException e) {
e.printStackTrace();
}
}
/**
* 下一曲
*/
private void next() {
if (currentPosition == musicList.size() - 1) {
currentPosition = 0;
} else {
currentPosition = currentPosition + 1;
}
play();
}
/**
* 上一曲
*/
private void previous() {
if (currentPosition == 0) {
currentPosition = musicList.size() - 1;
} else {
currentPosition = currentPosition - 1;
}
play();
}
// 自定義的執行緒
private class SeekBarThread implements Runnable {
@Override
public void run() {
while (mediaPlayer != null && isStop == false) {
// 將SeekBar位置設定到當前播放位置
seekbar.setProgress(mediaPlayer.getCurrentPosition());
try {
// 每100毫秒更新一次位置
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
MyAdapter
public class MusicAdapter extends BaseAdapter{
private Context mContext;
private List<MusicVO> mList;
public MusicAdapter(Context context,List<MusicVO> list) {
this.mContext = context;
this.mList = list;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View v = inflater.inflate(R.layout.item, null);
TextView nameText = (TextView) v.findViewById(R.id.name_view);
TextView singerText = (TextView) v.findViewById(R.id.singer_view);
nameText.setText(mList.get(position).getName());
singerText.setText(mList.get(position).getSinger());
return v;
}
}