媒体播放器无法加载活动时重新对方向变化的android [英] media player not load when activity recreated on orientation change android

本文介绍了媒体播放器无法加载活动时重新对方向变化的android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新使用的表面,以发挥视频播放器的视频,现在我要救媒体播放器的实例状态,当方向改变时,视图重载或重新再旧的媒体播放器的状态开始在老位置不加载在原有手段零位我设置在明显的像屏幕方向,但那个时候的onCreate不叫我也想叫onCreate方法时,屏幕方向改变的意思是说我要重新加载一个新的活动时,方向改变,也保存多媒体播放器的状态,请确认我被困当时我不知道是什么错误。

  SurfaceView videoSurface;
         MediaPlayer的播放器;
        VideoControllerView控制器;
        私人布尔mFullScreen = TRUE;

        @覆盖
        保护无效的onCreate(包savedInstanceState){
            super.onCreate(savedInstanceState);
            的setContentView(R.layout.activity_video_player);



                videoSurface =(SurfaceView)findViewById(R.id.videoSurface);
                SurfaceHolder videoHolder = videoSurface.getHolder();
                videoHolder.addCallback(本);

                球员=新的MediaPlayer();
                控制器=新VideoControllerView(本);

                尝试 {
                    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    player.setDataSource(这一点,Uri.parse(http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4));
                    player.setOn preparedListener(本);
                }赶上(抛出:IllegalArgumentException E){
                    e.printStackTrace();
                }赶上(SecurityException异常E){
                    e.printStackTrace();
                }赶上(IllegalStateException异常E){
                    e.printStackTrace();
                }赶上(IOException异常E){
                    e.printStackTrace();
                }
            }

            @覆盖
            公共布尔的onTouchEvent(MotionEvent事件){
                controller.show();
                返回false;
            }

            //实现SurfaceHolder.Callback
            @覆盖
            公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,高度INT){

            }

            @覆盖
            公共无效surfaceCreated(SurfaceHolder持有者){
              player.setDisplay(保持器);
              。玩家prepareAsync();
            }

            @覆盖
            公共无效surfaceDestroyed(SurfaceHolder持有者){

            }
            //结束SurfaceHolder.Callback

            //实现MediaPlayer.On preparedListener
            @覆盖
            公共无效于prepared(MediaPlayer的MP){
                controller.setMediaPlayer(本);
                controller.setAnchorView((的FrameLayout)findViewById(R.id.videoSurfaceContainer));
                player.start();
            }
            //结束MediaPlayer.On preparedListener

            //实现VideoMediaController.MediaPlayerControl
            @覆盖
            公共布尔canPause(){
                返回true;
            }

            @覆盖
            公共布尔canSeekBackward(){
                返回true;
            }

            @覆盖
            公共布尔canSeekForward(){
                返回true;
            }

            @覆盖
            公众诠释getBufferPercentage(){
                返回0;
            }

            @覆盖
            公众诠释getCurrentPosition(){
                返回player.getCurrentPosition();
            }

            @覆盖
            公众诠释getDuration(){
                返回player.getDuration();
            }

            @覆盖
            公共布尔IsPlaying模块(){
                返回player.isPlaying();
            }

            @覆盖
            公共无效暂停(){
                player.pause();
            }

            @覆盖
            公共无效seekTo(int i)以{
                player.seekTo(ⅰ);
            }

            @覆盖
            公共无效启动(){
                player.start();
            }



            @覆盖
        公共布尔isFullScreen(){
            如果(mFullScreen){
                Log.w(全屏,--set图​​标全screen--);
                Log.w(电流,player.getCurrentPosition()+);
            / *的ImageButton mF​​ullscreenButton =(的ImageButton)controller.findViewById(R.id.fullscreen);
                mFullscreenButton.setImageResource(R.drawable.ic_media_fullscreen_stretch);
               * /返回false;
            }其他{
                Log.w(全屏,--set图​​标小全screen--);
                返回true;
            }
        }

        @覆盖
        公共无效toggleFullScreen(){
            Log.w(全屏,-----------------点击toggleFullScreen -----------);
            setFullScreen(isFullScreen());

        }
        //结束VideoMediaController.MediaPlayerControl

        公共无效setFullScreen(布尔全屏){
            全屏= FALSE;

            如果(mFullScreen)

            {
                Log.w(全屏,-----------设置全屏SCREEN_ORIENTATION_LANDSCAPE ------------);

                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                DisplayMetrics displaymetrics =新DisplayMetrics();
                。getWindowManager()getDefaultDisplay()getMetrics(displaymetrics)。
                INT高= displaymetrics.heightPixels;
                INT宽度= displaymetrics.widthPixels;
                android.widget.FrameLayout.LayoutParams PARAMS =(android.widget.FrameLayout.LayoutParams)videoSurface.getLayoutParams();
                params.width =宽度;
                params.height =高度;
                params.setMargins(0,0,0,0);
                //设置图标全屏
                mFullScreen =全屏;
            }
            其他{
                Log.w(全屏,-----------设置小屏幕SCREEN_ORIENTATION_PORTRAIT ------------);
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                DisplayMetrics displaymetrics =新DisplayMetrics();
                。getWindowManager()getDefaultDisplay()getMetrics(displaymetrics)。
                最后的FrameLayout mFrame =(的FrameLayout)findViewById(R.id.videoSurfaceContainer);
                // INT高= displaymetrics.heightPixels;
                INT高= 225; //获取高架式集装箱视频// mFrame.getHeight()
                INT宽度= displaymetrics.widthPixels;
                android.widget.FrameLayout.LayoutParams PARAMS =(android.widget.FrameLayout.LayoutParams)videoSurface.getLayoutParams();
                params.width =宽度;
                params.height =高度;
                params.setMargins(0,0,0,0);
                //设置图标为小屏幕
                !mFullScreen =全屏;
            }
        }
       @覆盖
       保护无效的onSaveInstanceState(包estadoguardado){

           super.onSaveInstanceState(estadoguardado);
           如果(玩家!= NULL){

               INT POS = player.getCurrentPosition();
               estadoguardado.putInt(职位,POS);
           }

       }

        @覆盖
        保护无效onRestoreInstanceState(包estadoguardado)
        {

            super.onRestoreInstanceState(estadoguardado);
            如果(estadoguardado = NULL和放大器;!&安培;玩家!= NULL){
                INT POS = estadoguardado.getInt(职位);
                Log.w(位置,POS +);
                player.seekTo(POS);

            }

        }

        @覆盖
        公共无效onResume()
        {


            super.onResume();
            尝试 {
                // reinicia
                Toast.makeText(这一点,onResume2,Toast.LENGTH_SHORT).show();
                如果(球员== NULL)
                    player.setDataSource(这一点,Uri.parse(http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4));
                player.seekTo(0);
                player.setLooping(真正的);
                player.start();
            }
            赶上(例外五)
            {
                e.printStackTrace();
            }
        }
        @覆盖
        公共无效的onPause()
        {
            super.onPause();
            Toast.makeText(这一点,onPause2,Toast.LENGTH_SHORT).show();
            // LIBERA媒体播放器
            如果(玩家!= NULL)
            {
                player.release();
                球员= NULL;
            }
 

和其他类,从的FrameLayout延长

和应用程序时要运行一些崩溃

  java.lang.IllegalStateException
            在android.media.MediaPlayer。prepareAsync(本机方法)
            在whizpool.videoplayerexample.VideoPlayerActivity.surfaceCreated(VideoPlayerActivity.java:70)
            在android.view.SurfaceView.updateWindow(SurfaceView.java:554)
            在android.view.SurfaceView.access $ 000(SurfaceView.java:81)
            在android.view.SurfaceView $ 3.on preDraw(SurfaceView.java:169)
            在android.view.ViewTreeObserver.dispatchOn preDraw(ViewTreeObserver.java:693)
            在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1762)
            在android.os.Looper.loop(Looper.java:137)
            在android.app.ActivityThread.main(ActivityThread.java:4666)
            在java.lang.reflect.Method.invokeNative(本机方法)
            在java.lang.reflect.Method.invoke(Method.java:511
10月10日至十二号:00:48.726 2268年至2268年/ whizpool.videoplayerexample E / MediaPlayer的:尝试在错误的状态下进行seekTo:MPLAYER = 0x18332b8,mCurrentState = 2
10月10日至十二号:00:48.726 2268年至2268年/ whizpool.videoplayerexample E / MediaPlayer的:错误(-38,0)
10月10日至十二号:00:48.727 2268年至2268年/ whizpool.videoplayerexample E / MediaPlayer的:启动名为状态0
10月10日至十二号:00:48.727 2268年至2268年/ whizpool.videoplayerexample E / MediaPlayer的:错误(-38,0)
10月10日至十二号:00:48.738 2268年至2268年/ whizpool.videoplayerexample E / MediaPlayer的错误:(-38,0)
10月10日至十二号:00:48.738 2268年至2268年/ whizpool.videoplayerexample E / MediaPlayer的错误:(-38,0)
10月10日至十二号:00:48.885 2268年至2268年/ whizpool.videoplayerexample E / MediaPlayer的:prepareAsync称为状态0
 

解决方案

您需要几秒钟后重置取向SCREEN_ORIENTATION_SENSOR因此传感器就会开始工作了。

  

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

     

新的处理程序()。postDelayed(新的Runnable(){

  @覆盖
    公共无效的run(){

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

    }
},2000);
 

I am new to play a video in video player using surface view now i want to save instance state of media player when orientation change when view reloaded or recreated then old media player state start at old position not to load on original means at zero position i set in manifest like screen orientation but that time oncreate not called i want to call also oncreate method when screen orientation change means to say i want to reload a new activity when orientation change and also save media player state please acknowledge i am stuck at that time i don't know what mistake.

 SurfaceView videoSurface;
         MediaPlayer player;
        VideoControllerView controller;
        private boolean mFullScreen = true;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_video_player);



                videoSurface = (SurfaceView) findViewById(R.id.videoSurface);
                SurfaceHolder videoHolder = videoSurface.getHolder();
                videoHolder.addCallback(this);

                player = new MediaPlayer();
                controller = new VideoControllerView(this);

                try {
                    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    player.setDataSource(this, Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"));
                    player.setOnPreparedListener(this);
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public boolean onTouchEvent(MotionEvent event) {
                controller.show();
                return false;
            }

            // Implement SurfaceHolder.Callback
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
              player.setDisplay(holder);
              player.prepareAsync();
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

            }
            // End SurfaceHolder.Callback

            // Implement MediaPlayer.OnPreparedListener
            @Override
            public void onPrepared(MediaPlayer mp) {
                controller.setMediaPlayer(this);
                controller.setAnchorView((FrameLayout) findViewById(R.id.videoSurfaceContainer));
                player.start();
            }
            // End MediaPlayer.OnPreparedListener

            // Implement VideoMediaController.MediaPlayerControl
            @Override
            public boolean canPause() {
                return true;
            }

            @Override
            public boolean canSeekBackward() {
                return true;
            }

            @Override
            public boolean canSeekForward() {
                return true;
            }

            @Override
            public int getBufferPercentage() {
                return 0;
            }

            @Override
            public int getCurrentPosition() {
                return player.getCurrentPosition();
            }

            @Override
            public int getDuration() {
                return player.getDuration();
            }

            @Override
            public boolean isPlaying() {
                return player.isPlaying();
            }

            @Override
            public void pause() {
                player.pause();
            }

            @Override
            public void seekTo(int i) {
                player.seekTo(i);
            }

            @Override
            public void start() {
                player.start();
            }



            @Override
        public boolean isFullScreen() {
            if(mFullScreen){
                Log.w("FullScreen", "--set icon full screen--");
                Log.w("curr",player.getCurrentPosition()+"");
            /*    ImageButton mFullscreenButton=(ImageButton)controller.findViewById(R.id.fullscreen);
                mFullscreenButton.setImageResource(R.drawable.ic_media_fullscreen_stretch);
               */ return false;
            }else{
                Log.w("FullScreen", "--set icon small full screen--");
                return true;
            }
        }

        @Override
        public void toggleFullScreen() {
            Log.w("FullScreen", "-----------------click toggleFullScreen-----------");
            setFullScreen(isFullScreen());

        }
        // End VideoMediaController.MediaPlayerControl

        public void setFullScreen(boolean fullScreen){
            fullScreen = false;

            if (mFullScreen)

            {
                Log.w("FullScreen", "-----------Set full screen SCREEN_ORIENTATION_LANDSCAPE------------");

                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                DisplayMetrics displaymetrics = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
                int height = displaymetrics.heightPixels;
                int width = displaymetrics.widthPixels;
                android.widget.FrameLayout.LayoutParams params = (android.widget.FrameLayout.LayoutParams) videoSurface.getLayoutParams();
                params.width = width;
                params.height=height;
                params.setMargins(0, 0, 0, 0);
                //set icon is full screen
                mFullScreen = fullScreen;
            }
            else{
                Log.w("FullScreen", "-----------Set small screen SCREEN_ORIENTATION_PORTRAIT------------");
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                DisplayMetrics displaymetrics = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
                final FrameLayout mFrame = (FrameLayout) findViewById(R.id.videoSurfaceContainer);
                // int height = displaymetrics.heightPixels;
                int height =225;//get height Frame Container video//mFrame.getHeight()
                int width =displaymetrics.widthPixels;
                android.widget.FrameLayout.LayoutParams params = (android.widget.FrameLayout.LayoutParams) videoSurface.getLayoutParams();
                params.width = width;
                params.height= height;
                params.setMargins(0, 0, 0, 0);
                //set icon is small screen
                mFullScreen = !fullScreen;
            }
        }
       @Override
       protected void onSaveInstanceState(Bundle estadoguardado){

           super.onSaveInstanceState(estadoguardado);
           if(player!=null){

               int pos=player.getCurrentPosition();
               estadoguardado.putInt("posicion", pos);
           }

       }

        @Override
        protected void onRestoreInstanceState(Bundle estadoguardado)
        {

            super.onRestoreInstanceState(estadoguardado);
            if(estadoguardado!=null && player!=null){
                int pos=estadoguardado.getInt("posicion");
                Log.w("position",pos+"");
                player.seekTo(pos);

            }

        }

        @Override
        public void onResume()
        {


            super.onResume();
            try {
                //reinicia
                Toast.makeText(this, "onResume2", Toast.LENGTH_SHORT).show();
                if (player == null)
                    player.setDataSource(this, Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"));
                player.seekTo(0);
                player.setLooping(true);
                player.start();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
        @Override
        public void onPause()
        {
            super.onPause();
            Toast.makeText(this, "onPause2", Toast.LENGTH_SHORT).show();
            //LIBERA A MEDIA PLAYER
            if (player != null)
            {
                player.release();
                player = null;
            }

and other class which extend from frameLayout

and some crashes when app going to run

java.lang.IllegalStateException
            at android.media.MediaPlayer.prepareAsync(Native Method)
            at whizpool.videoplayerexample.VideoPlayerActivity.surfaceCreated(VideoPlayerActivity.java:70)
            at android.view.SurfaceView.updateWindow(SurfaceView.java:554)
            at android.view.SurfaceView.access$000(SurfaceView.java:81)
            at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169)
            at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:693)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1762)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4666)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511   
10-12 10:00:48.726    2268-2268/whizpool.videoplayerexample E/MediaPlayer﹕ Attempt to perform seekTo in wrong state: mPlayer=0x18332b8, mCurrentState=2
10-12 10:00:48.726    2268-2268/whizpool.videoplayerexample E/MediaPlayer﹕ error (-38, 0)
10-12 10:00:48.727    2268-2268/whizpool.videoplayerexample E/MediaPlayer﹕ start called in state 0
10-12 10:00:48.727    2268-2268/whizpool.videoplayerexample E/MediaPlayer﹕ error (-38, 0)
10-12 10:00:48.738    2268-2268/whizpool.videoplayerexample E/MediaPlayer﹕ Error (-38,0)
10-12 10:00:48.738    2268-2268/whizpool.videoplayerexample E/MediaPlayer﹕ Error (-38,0)
10-12 10:00:48.885    2268-2268/whizpool.videoplayerexample E/MediaPlayer﹕ prepareAsync called in state 0

解决方案

You need to reset the orientation to SCREEN_ORIENTATION_SENSOR after a few seconds so the sensor will start to work again..

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

new Handler().postDelayed(new Runnable() {

    @Override
    public void run() {

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

    }
}, 2000);

这篇关于媒体播放器无法加载活动时重新对方向变化的android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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