android 两个放置VideoView的Actitity来回切换BUG

java.lang.IllegalArgumentException: Receiver not registered: android.media.MediaPlayer$...

非法参数异常:接收机没有注册


最近在做一个盒子的Launcher APP,要求主界面有快捷播放窗(即要放一个VideoView),点击快捷播放窗,进入全屏播放(又一个VideoView),开始播放都很正常,但反复切换主界面Activity和全屏界面Activity就会产生上述错误。无奈各种百度都没解决了。(主界面Activity是不会也不能销毁的,就是说快捷播放窗口VideView只是暂停,并没销毁,从全屏播放Activity切回主界面时,快捷窗口不需要缓冲就可以继续播放。)

后来一资深同事告诉我,说之前有同事就遇到过这个BUG,说什么android VideoView 不能同时有两个在播放,要不你不要用android的VideoView,或者百度找其他的播放器框架。我奇怪的是为啥要多点几次才会出现这个BUG,而不是第一次就出现?这个还是相当纠结的问题啊,没办法要赶进度,有时间再深入研究研究。


这个问题的临时解决办法是:不用android的VideoView,用surfaceView和MediaPlayer来做一个简单的播放器。

public class VideoViewDemo extends Activity{

	private Uri uri;
	private SurfaceView homeSurfaceView;
	private MediaPlayer mMediaPlayer;
	private View loadingView;
	private ImageView homeVideoStart;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.video_demo);

		loadingView = findViewById(R.id.home_live_loading);
		mMediaPlayer = new MediaPlayer();
		//设置音乐流的类型
		mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
		mMediaPlayer.setOnPreparedListener(new OnPreparedListener() {

			@Override
			public void onPrepared(MediaPlayer arg0) {
				try{
					//设置video影片以surfaceviewholder播放
					mMediaPlayer.setDisplay(homeSurfaceView.getHolder());
				}catch (Exception e) {
					//会报java.lang.IllegalArgumentException: The surface has been released
					e.printStackTrace();
				}
//				mMediaPlayer.start();//可以不点击播放,缓冲完直接播放
			}
		});
		mMediaPlayer.setOnInfoListener(new OnInfoListener() {

			@Override
			public boolean onInfo(MediaPlayer mp, int what, int extra) {
				if(what == MediaPlayer.MEDIA_INFO_BUFFERING_START){
					loadingView.setVisibility(View.VISIBLE);
				}else if(what == MediaPlayer.MEDIA_INFO_BUFFERING_END){
					if(mp.isPlaying()){
						loadingView.setVisibility(View.INVISIBLE);
					}
				}
				return true;
			}
		});


		homeSurfaceView = findViewById(R.id.home_live_play_surfaceView);
		//设置surfaceview不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前(4.0以下要加)
		homeSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		//对surface对象的状态进行监听
		homeSurfaceView.getHolder().addCallback(new SurceCallBack());
		homeVideoStart = (ImageView) findViewById(R.id.home_live_start);
		homeVideoStart.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				mMediaPlayer.start();
				if(mMediaPlayer.isPlaying()){
					homeVideoStart.setVisibility(View.GONE);
				}
			}
		});
		
	}

	@Override
	protected void onResume() {
		super.onResume();
		play("");
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		mMediaPlayer.stop();
	}
	
	private void play(String url) {
		uri = Uri.parse(url);
		try {
			//重置为初始状态
			mMediaPlayer.reset();
			//视频路径
			mMediaPlayer.setDataSource(this,uri);
			//缓冲
			mMediaPlayer.prepareAsync();//会报java.lang.IllegalStateException
		} catch (Exception e) {
			e.printStackTrace();
		}

	}


	private final class SurceCallBack implements SurfaceHolder.Callback{

		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width,
				int height) {
			//改变画面
		}

		@Override
		public void surfaceCreated(SurfaceHolder holder) {
			play("");
		}

		@Override
		public void surfaceDestroyed(SurfaceHolder holder) {
			if(mMediaPlayer.isPlaying()){
				mMediaPlayer.stop();
			}
		}
	}
}

希望大神能指教指教 可怜~~~



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值