IllegalStateException异常返回包含活动时的MediaPlayer [英] IllegalStateException when returning to Activity containing MediaPlayer
本文介绍了IllegalStateException异常返回包含活动时的MediaPlayer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个MediaPlayer的一个活动,每当我启动另一个活动从它(例如Chromecast的控制器活动或使用ShareActionProvider),并返回到与MediaPlayer的活动,我得到以下IllegalStateException异常:
15 11-13:48:33.083 22342-22342 / com.iosharp.android.ssplayer E / AndroidRuntime:致命异常:主要
java.lang.IllegalStateException
在android.media.MediaPlayer._setVideoSurface(本机方法)
在android.media.MediaPlayer.setDisplay(MediaPlayer.java:733)
在com.iosharp.android.ssplayer.videoplayer.VideoActivity.surfaceCreated(VideoActivity.java:126)
在android.view.SurfaceView.updateWindow(SurfaceView.java:610)
在android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:239)
在android.view.View.dispatchWindowVisibilityChanged(View.java:8170)
阅读它说setDisplay()可以称得上是任何状态。
的文档我的相关code以下:
公共类VideoActivity扩展ActionBarActivity实现SurfaceHolder.Callback,MediaPlayer.On preparedListener,
VideoControllerView.MediaPlayerControl,MediaPlayer.OnErrorListener { 私人SurfaceView mSurfaceView;
私人MediaPlayer的MPLAYER;
私人VideoControllerView mController;
私人字符串mURL;
私人SurfaceHolder mSurfaceHolder;
私人VideoCastManager mCastManager;
私人MediaInfo mSelectedMedia;
私人IVideoCastConsumer mVideoCastConsumer;
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
mCastManager = CastApplication.getCastManager(本);
的setContentView(R.layout.activity_video); mSurfaceView =(SurfaceView)findViewById(R.id.videoSurface); setupActionBar();
setupCastListeners(); 束B = getIntent()getExtras()。
如果(B!= NULL){
mSelectedMedia = Utils.toMediaInfo(getIntent()getBundleExtra(传媒));
mURL = mSelectedMedia.getContentId(); mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(本);
MPLAYER =新的MediaPlayer();
mController =新VideoControllerView(这一点,假);
}
}
@覆盖
保护无效onResume(){
super.onResume();
setupLocalPlayback(); 如果(mCastManager!= NULL){
mCastManager.incrementUiCounter();
}
}
@覆盖
公共布尔onTouchEvent(MotionEvent事件){
mController.show();
showActionBar();
返回false;
} @覆盖
公共无效onBack pressed(){
super.onBack pressed();
//隐藏到getCurrentPosition的prevent非法状态异常
mController.hide();
如果(MPLAYER!= NULL){
mPlayer.reset();
}
} @覆盖
保护无效的onPause(){
super.onPause();
mController.hide();
mPlayer.release(); 如果(mCastManager!= NULL){
mCastManager.decrementUiCounter();
}
}
解决方案
将
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(本);
MPLAYER =新的MediaPlayer();
mController =新VideoControllerView(这一点,假);
在bundle.getExtras(上图)检查像
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(本);
MPLAYER =新的MediaPlayer();
mController =新VideoControllerView(这一点,假);束B = getIntent()getExtras()。
如果(B!= NULL){
mSelectedMedia = Utils.toMediaInfo(getIntent()getBundleExtra(传媒));
mURL = mSelectedMedia.getContentId();
}
要确保它总是初始化
I have an Activity with a MediaPlayer and whenever I launch another Activity from it (for example Chromecast Controller Activity or using a ShareActionProvider) and return to the Activity with the MediaPlayer, I get the following IllegalStateException:
11-13 15:48:33.083 22342-22342/com.iosharp.android.ssplayer E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.IllegalStateException
at android.media.MediaPlayer._setVideoSurface(Native Method)
at android.media.MediaPlayer.setDisplay(MediaPlayer.java:733)
at com.iosharp.android.ssplayer.videoplayer.VideoActivity.surfaceCreated(VideoActivity.java:126)
at android.view.SurfaceView.updateWindow(SurfaceView.java:610)
at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:239)
at android.view.View.dispatchWindowVisibilityChanged(View.java:8170)
Reading the documentation it says setDisplay() can be called in any state.
My relevant code below:
public class VideoActivity extends ActionBarActivity implements SurfaceHolder.Callback, MediaPlayer.OnPreparedListener,
VideoControllerView.MediaPlayerControl, MediaPlayer.OnErrorListener {
private SurfaceView mSurfaceView;
private MediaPlayer mPlayer;
private VideoControllerView mController;
private String mURL;
private SurfaceHolder mSurfaceHolder;
private VideoCastManager mCastManager;
private MediaInfo mSelectedMedia;
private IVideoCastConsumer mVideoCastConsumer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCastManager = CastApplication.getCastManager(this);
setContentView(R.layout.activity_video);
mSurfaceView = (SurfaceView) findViewById(R.id.videoSurface);
setupActionBar();
setupCastListeners();
Bundle b = getIntent().getExtras();
if (b != null) {
mSelectedMedia = Utils.toMediaInfo(getIntent().getBundleExtra("media"));
mURL = mSelectedMedia.getContentId();
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
mPlayer = new MediaPlayer();
mController = new VideoControllerView(this, false);
}
}
@Override
protected void onResume() {
super.onResume();
setupLocalPlayback();
if (mCastManager != null) {
mCastManager.incrementUiCounter();
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mController.show();
showActionBar();
return false;
}
@Override
public void onBackPressed() {
super.onBackPressed();
// Hide to prevent illegal state exception of getCurrentPosition
mController.hide();
if (mPlayer != null) {
mPlayer.reset();
}
}
@Override
protected void onPause() {
super.onPause();
mController.hide();
mPlayer.release();
if (mCastManager != null) {
mCastManager.decrementUiCounter();
}
}
解决方案
Put
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
mPlayer = new MediaPlayer();
mController = new VideoControllerView(this, false);
above the bundle.getExtras() check like
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
mPlayer = new MediaPlayer();
mController = new VideoControllerView(this, false);
Bundle b = getIntent().getExtras();
if (b != null) {
mSelectedMedia = Utils.toMediaInfo(getIntent().getBundleExtra("media"));
mURL = mSelectedMedia.getContentId();
}
to ensure it's always initialized
这篇关于IllegalStateException异常返回包含活动时的MediaPlayer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文