1. 程式人生 > >Android入門教程 MediaPlayer教程【使用進度條】

Android入門教程 MediaPlayer教程【使用進度條】

目標:獲取手機中的歌曲,並使用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;
    }

}