MediaPlayer的簡單使用

// 設置uri
			if (!TextUtils.isEmpty(url)) {
				mSwitchIv.setSelected(false);
				if (mMediaPlayer != null) {
					mMediaPlayer.release();
					mMediaPlayer = null;
				}
				mMediaPlayer = new MediaPlayer(TelecastPlayActivity.this);
				// 設置監聽器
				mMediaPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {

					@Override
					public void onBufferingUpdate(MediaPlayer mp, int percent) {
						// 緩衝狀態中,percent爲下載量的百分比,一般在videoView中間設置
						mPercent = percent;
					}
				});
				mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {

					@Override
					public void onCompletion(MediaPlayer mp) {
						mSwitchIv.setSelected(false);

					}
				});
				mMediaPlayer.setOnInfoListener(new MediaInfoListener());
				// mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
				// @Override
				// public void onPrepared(MediaPlayer mediaPlayer) {
				// mediaPlayer.setPlaybackSpeed(1.0f);
				// mediaPlayer.start();
				// mSwitchIv.setSelected(true);
				// show(sDefaultTimeout);
				// }
				// });
				Uri uri = Uri.parse(url);
				try {
					mMediaPlayer.setDataSource(TelecastPlayActivity.this, uri);
					mMediaPlayer.prepare();
					mMediaPlayer.start();
					mSwitchIv.setSelected(true);
					show(sDefaultTimeout);
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (SecurityException e) {
					e.printStackTrace();
				} catch (IllegalStateException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

如果需求可以切換音頻,需要先施放,重新new新的MediaPlayer,並且不能使用異步準備

show(sDefaultTimeout)就是用一個handler不停的刷新刷新進度條:

public void show(int timeout) {
		mHandler.sendEmptyMessage(SHOW_PROGRESS);
	}

private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			long pos;
			switch (msg.what) {
			case SHOW_PROGRESS:
				pos = setProgress();
				msg = obtainMessage(SHOW_PROGRESS);
				sendMessageDelayed(msg, 1000 - (pos % 1000));
				break;
			}
		}
	};

setProgress()就是設置進度條百分比:

private long setProgress() {

		long position = mMediaPlayer.getCurrentPosition();
		long duration = mMediaPlayer.getDuration();
		if (mSeekBar != null) {
			if (duration > 0) {
				long pos = 1000L * position / duration;
				mSeekBar.setProgress((int) pos);
			}
			int percent = mPercent;
			//
			mSeekBar.setSecondaryProgress(percent * 10);
		}

		mDuration = duration;

		return position;
	}

以上在音頻播放時控制了進度條的更新,同時seekbar被手指拖動時要響應MediaPlayer的進度:

	mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				//mDuration爲進度條的總長度,seekBar.getProgress()獲得的是百分比,/ 1000後就是0.幾,然後再乘以總長度就設置了mMediaPlayer需要播放的進度
				mMediaPlayer.seekTo((mDuration * seekBar.getProgress()) / 1000);
				show(sDefaultTimeout);
				mHandler.removeMessages(SHOW_PROGRESS);
				// mAM.setStreamMute(AudioManager.STREAM_MUSIC, false);
				mHandler.sendEmptyMessageDelayed(SHOW_PROGRESS, 1000);
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {

			}

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
				if (!fromUser)
					return;
				long newposition = (mDuration * progress) / 1000;
				mMediaPlayer.seekTo(newposition);
			}
		});





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章