当方向改变时重新创建活动时,媒体播放器不会加载

2024-02-12

我是新使用表面视图在视频播放器中播放视频的新手,现在我想在重新加载或重新创建视图时方向发生变化时保存媒体播放器的实例状态,然后旧媒体播放器状态从旧位置开始,而不是在零位置加载到原始装置上像屏幕方向一样在清单中设置,但当时 oncreate 没有被调用,当屏幕方向改变时,我想也调用 oncreate 方法,这意味着我想在方向改变时重新加载新的活动,并保存媒体播放器状态,请确认我当时被卡住了我不知道什么错误。

 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;
            }

以及其他从frameLayout扩展的类

应用程序运行时会发生一些崩溃

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

您需要在几秒钟后将方向重置为 SCREEN_ORIENTATION_SENSOR,以便传感器再次开始工作。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

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

    @Override
    public void run() {

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

    }
}, 2000);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当方向改变时重新创建活动时,媒体播放器不会加载 的相关文章

随机推荐

  • Matlab 3d 体积可视化和 3d 叠加

    问题几乎就是标题 我有一个作为原始数据加载的 3d 体积 256 256 256 size A 它仅包含零和一的值 其中 1 代表结构 0 代表 空气 我想在 MATLAB 中可视化该结构 然后对其运行算法并在其上覆盖一个覆盖层 假设颜色为
  • node-mysql 一个查询中的多个语句

    我在用着nodejs 10 26 express 3 5 node mysql 2 1 1 MySQL Server Version 5 6 16 我有 4 个 DELETE 只需要 1 个数据库请求 所以我用 连接 DELETE 命令 但
  • Flask url_用于生成 http URL 而不是 https

    我在用url for当用户注销时生成重定向 URL return redirect url for index external True 但是 当我将页面更改为https连接 将url for仍然给我http 我想明确询问url for
  • Laravel 空白白页

    我在群组中的获取路线有问题 这是我的代码 Route group prefix gt commodities function Route get commodities as gt showCommodities uses gt Comm
  • Python格式整数转换为固定长度字符串[重复]

    这个问题在这里已经有答案了 我想根据一个生成一个字符串int和零一起 并且长度应该始终为5不多也不少 For example Consider a Integer 1 Formatted String 00001 Consider a In
  • 什么是私有字节、虚拟字节、工作集?

    我正在尝试使用 perfmon windows 实用程序来调试进程中的内存泄漏 这是 perfmon 对这些术语的解释 工作集是该进程的工作集的当前大小 以字节为单位 工作集是进程中的线程最近接触的内存页集 如果计算机中的可用内存高于阈值
  • 为什么要对参数进行 null 转换? [复制]

    这个问题在这里已经有答案了 何时以及为什么有人会做以下事情 doSomething MyClass null 你曾经这样做过吗 您能分享一下您的经验吗 If doSomething已重载 您需要将 null 显式转换为MyClass因此选择
  • 计算给定月份的前 12 个月 - SimpleDateFormat

    我试图将给定月份 取自数据库 中的前 12 个月放入数组列表中 List
  • 如何强制 Apollo Client 使用缓存数据

    我们有一个最初加载小部件列表的应用程序 query Widgets widgets Widgets fragment Widgets on Widgets name description rootWidget widgets Widget
  • 由于“权限被拒绝”,docker compose down 失败

    跑步时docker compose stop它无法停止 docker 镜像 并给出如下错误 ERROR for nginx cannot stop container 5f5ed6d2110a0d845508ede160d8196d3e01
  • Scrapy + Splash:无法选择元素

    我正在学习使用 scrapy 和splash 作为练习 我正在尝试访问https www ubereats com stores https www ubereats com stores 单击地址文本框 输入位置 然后按 Enter 按钮
  • 运行“npmauditfix--force”会降级反应脚本

    我的 React 项目有一个很大的问题 我正在尝试更新项目中的库 但出现了问题 错误的 这是package json 请注意 react scripts版本设置为 4 0 3 name server version 1 1 0 descri
  • 未能找到构建工具修订版 21.1.1 - sdk 是最新的

    我正在运行 linux android sdk 安装 我的新项目需要构建工具 21 1 1 不知何故 这个构建工具不存在 尽管我的sdk是最新的 但在build tools文件夹中现在有android 4 4W文件夹 android 更新
  • 如何让 CMake 使用系统路径上的默认编译器?

    目前 我从构建目录调用 CMake 如下所示 CXX opt gcc 4 8 bin g cmake 让 CMake 使用这个特定的编译器 否则它使用操作系统默认编译器 我的路径有 opt gcc 4 8 bin那么 有没有办法在 CMak
  • Orchard CMS 中的 Work<> 类有什么用?

    简单明了 它的用例是什么Orchard Environment Work lt gt 类定义于Orchard Environment WorkContextModule cs 它可以在几个地方找到 例如 private readonly W
  • 将排序描述符应用于从模板创建的 NSFetchRequest

    我在核心数据模型中定义了一个名为 RemainingGaneProjections 的提取请求 我想执行该获取请求并按实体的属性之一对结果进行排序 我的代码如下所示 NSFetchRequest projectionsRequest mod
  • 如何防止/检测使用 EXP() 的 Postgresql 计算中的下溢

    在使用 EXP x 函数的查询中 我收到一个值超出范围 来自 pgsql 的下溢错误 x 的什么值会触发此操作 我该如何预防或检测它 函数 exp 称为指数函数 其反函数是自然对数 或以 e 为底的对数 数字 e 通常也被定义为自然对数的底
  • 在 Javascript 中获取查询字符串数组值[重复]

    这个问题在这里已经有答案了 我有一个使用 get 方法并包含一个数组的表单 http www example com name hello name world 我正在尝试使用 JavaScript 或 jQuery 检索数组值 hello
  • Chrome 51 滚动时出现奇怪的框阴影错误

    所以在制作网站时我发现了一个奇怪的box shadowChrome 51 上的错误 我的网站有一个固定标题 其中包含box shadow 当我向上或向下滚动时 框阴影会留下一些标记 水平灰线 我也无法在 jsfiddle 上重现这个错误 小
  • 当方向改变时重新创建活动时,媒体播放器不会加载

    我是新使用表面视图在视频播放器中播放视频的新手 现在我想在重新加载或重新创建视图时方向发生变化时保存媒体播放器的实例状态 然后旧媒体播放器状态从旧位置开始 而不是在零位置加载到原始装置上像屏幕方向一样在清单中设置 但当时 oncreate