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();
}
}
}
}
希望大神能指教指教 ~~~