IllegalStateException异常返回包含活动时的MediaPlayer [英] IllegalStateException when returning to Activity containing MediaPlayer

查看:1648
本文介绍了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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆