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

来源:互联网 发布:ps淘宝美工教程全集 编辑:程序博客网 时间:2024/04/28 15:21

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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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() {@Overridepublic void onPrepared(MediaPlayer arg0) {try{//设置video影片以surfaceviewholder播放mMediaPlayer.setDisplay(homeSurfaceView.getHolder());}catch (Exception e) {//会报java.lang.IllegalArgumentException: The surface has been releasede.printStackTrace();}//mMediaPlayer.start();//可以不点击播放,缓冲完直接播放}});mMediaPlayer.setOnInfoListener(new OnInfoListener() {@Overridepublic 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() {@Overridepublic void onClick(View arg0) {mMediaPlayer.start();if(mMediaPlayer.isPlaying()){homeVideoStart.setVisibility(View.GONE);}}});}@Overrideprotected void onResume() {super.onResume();play("");}@Overrideprotected 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{@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {//改变画面}@Overridepublic void surfaceCreated(SurfaceHolder holder) {play("");}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if(mMediaPlayer.isPlaying()){mMediaPlayer.stop();}}}}

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



0 0
原创粉丝点击