Android基础之网络视频播放器

版权声明:本文为博主原创文章,未经博主允许不得转载。

开发步骤:

视频播放器
1.一般视频播放器的界面是横屏的  全屏
2.准备好视频文件(暂停)
3.视频播放器=MediaPlayer播放音频+界面
4.SurfaceView Surface表皮/皮肤     双缓冲视图
java.lang.IllegalArgumentException: The surface has been released
说人话:SurfaceView被释放了--->SurfaceView压根就没有---->SurfaceView还没初始化
因为SurfaceView是用来播放视频的  在内部需要先准备一下数据 才能去播放(需要一段时间)
5.什么时候SurfaceView准备完? holder.addCallback()
6.播放的正常情况下应该有个进度条?
7.拖动之后没有效果
8.当没人去触摸界面的时候  进度条会自动隐藏掉  当再次点击屏幕的时候 进度条会出现 然后过了一会后继续隐藏




网络视频:
1.远程服务器下的视频数据在加载的时候 可能没那么快 导致了黑屏
2.出现了黑白屏(缓冲数据)---->应该在中间设置一个加载框


MediaPlayer的操作:
1.new MediaPlayer()--->IDLE空闲状态
2.设置数据源 setDataSource()
3.准备播放的数据 prepare()
4.开始播放 start()-------------------------------->正在播放视频
如果你想播放其他的音乐 但是已经有音乐在播放了--->reset() 重置播放器 释放原有资源
stop()停止
pause()暂停--->是可以恢复的--->start()
音乐播放完成--->也是可以恢复的--->start()




* 如果是网络数据 一般调用准备播放的数据 prepareAsync()
当OnPreparedListener.onPrepared()被调用的时候 说明数据就准备完毕了
* 当资源不再使用 或者说 播放器不想要了 可以调用release()去释放资源
* 为了提供用户的体验 当播放失败的时候 提醒用户 可以调用OnErrorListener.onError();





public class MainActivity extends Activity implements OnSeekBarChangeListener,
		OnTouchListener {

	private MediaPlayer mMediaPlayer;
	private SurfaceView mSurfaceView;
	private SeekBar mVedioSkb;
	protected Timer mTimer;
	private Timer mVedioSkbTimer;
	private ProgressBar mLoadingPb;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
		// 给SurfaceView设置一个触摸的监听器
		mSurfaceView.setOnTouchListener(this);
		
		mLoadingPb = (ProgressBar) findViewById(R.id.loading_pb);
		
		mVedioSkb = (SeekBar) findViewById(R.id.vedio_skb);
		// 给SeekBar设置一个拖动事件的监听器
		mVedioSkb.setOnSeekBarChangeListener(this);
		// 过了2秒后 进度条自动隐藏
		hideVedioSkbAfter2Seconds();

		// SurfaceHolder管理界面播放的一个控制器
		SurfaceHolder holder = mSurfaceView.getHolder();
		// 给holder设置一个SurfaceView准备数据的监听器
		holder.addCallback(new Callback() {

			@Override
			public void surfaceDestroyed(SurfaceHolder holder) {

			}

			// mSurfaceView 准备完毕的时候调用的
			@Override
			public void surfaceCreated(final SurfaceHolder holder) {
				try {
					if (mMediaPlayer == null) {
					mMediaPlayer = new MediaPlayer();
					// 设置网络视频数据
					Uri uri = Uri.parse("http://192.168.14.130:8080/oppo.3gp");
					mMediaPlayer.setDataSource(MainActivity.this, uri);
					mMediaPlayer.prepareAsync();
					// 异步加载数据的情况下 需要给mMediaPlayer设置一个异步准备数据的操作
					// 以避免加载框转动的时候出现卡顿
					mMediaPlayer
							.setOnPreparedListener(new OnPreparedListener() {

								// 异步准备数据完毕后 该方法就会被调用
								@Override
								public void onPrepared(MediaPlayer mp) {

									//播放之前 需要隐藏加载框
									mLoadingPb.setVisibility(View.GONE);
									
									mMediaPlayer.start();
									// 关联音频与界面
									mMediaPlayer.setDisplay(holder);
									// 设置进度条总进度
									mVedioSkb.setMax(mMediaPlayer.getDuration());
									// 创建一个定时器 设置进度条的当前进度
									mTimer = new Timer();
									mTimer.schedule(new TimerTask() {
										// 该方法是运行在子线程中的
										@Override
										public void run() {
											// 在子线程中调用mVedioSkb的setProgress()
											// 它在内部会返回主线程操作UI
											mVedioSkb.setProgress(mMediaPlayer
													.getCurrentPosition());
										}
									}, 500, 500);
								}
							});
						}else{
							mMediaPlayer.setDisplay(holder);
						}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}

			@Override
			public void surfaceChanged(SurfaceHolder holder, int format,
					int width, int height) {

			}
		});

	}

	private void hideVedioSkbAfter2Seconds() {
		mVedioSkbTimer = new Timer();
		mVedioSkbTimer.schedule(new TimerTask() {

			@Override
			public void run() {
				runOnUiThread(new Runnable() {

					@Override
					public void run() {
						mVedioSkb.setVisibility(View.GONE);
					}
				});
			}
		}, 2 * 1000);
	}

	@Override
	public void onProgressChanged(SeekBar seekBar, int progress,
			boolean fromUser) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onStartTrackingTouch(SeekBar seekBar) {
		// TODO Auto-generated method stub

	}

	// 在拖动完成后 首先获取SeekBar当前进度 修改视频的播放进度
	@Override
	public void onStopTrackingTouch(SeekBar seekBar) {
		int progress = seekBar.getProgress();
		mMediaPlayer.seekTo(progress);
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// 首先让mVedioSkb显示出来
		mVedioSkb.setVisibility(View.VISIBLE);
		// 过了2秒后再次隐藏
		hideVedioSkbAfter2Seconds();
		return false;
	}



		@Override
	protected void onRestart() {
		// 恢复播放

		mMediaPlayer.start();
		super.onRestart();
	}

	@Override
	protected void onStop() {
		// 暂停播放器,
		mMediaPlayer.pause();
		super.onStop();
	}

	/*
	 * 退出销毁资源
	 */
	@Override
	protected void onDestroy() {
	
		mMediaPlayer.stop();
		mMediaPlayer.release();
		mMediaPlayer=null;
		super.onDestroy();

	}

}

修改主题

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.m520it.httpPlayer.MainActivity"
            android:label="@string/app_name" 
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:screenOrientation="landscape" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>





























  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值