【问题标题】:Rotating phone restarts video on android旋转手机重新启动android上的视频
【发布时间】:2011-08-24 10:11:21
【问题描述】:

当我旋转手机时,我的 Activity 会重新启动。我有一个播放视频的视频视图,我旋转并重新启动视频。现在我发现将它添加到清单中的我的活动中修复了它

<activity android:name="Vforum" android:configChanges="orientation"></activity>

现在的问题是视频控件在它们消失并返回之前不会被重绘,因此要么很长的控件从横向模式变为纵向模式,要么很短的控件从纵向变为横向。一旦它们消失,然后我点击让它们回来,那么它们的大小就正确了。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: android video controls android-videoview


    【解决方案1】:

    考虑在 Activity 生命周期事件中记住视频文件的位置。创建 Activity 后,您可以获取视频位置并从它重新启动的那一刻开始播放。

    在您的 Activity 类中:

    @Override
    protected void onCreate(Bundle bundle){
       super.onCreate(bundle);
       int mPos=bundle.getInt("pos"); // get position, also check if value exists, refer to documentation for more info
    }
    
    @Override
    protected void onSaveInstanceState (Bundle outState){
        outState.putInt("pos", myVideoView.getCurrentPosition()); // save it here
    }
    

    【讨论】:

    • 旋转时调用什么生命周期事件?我很快在谷歌上搜索了一下,结果很短。我看到myVideoView.getCurrentPosition() 会保存当前时间,但是当我旋转并重置时,我也看到渐进式下载也重新开始。你能提供一个简单的例子吗? sudo 代码甚至可以为我工作,谢谢!
    • 当您旋转手机时,当前的 Activity 实例被销毁并创建新的实例,因此您可以在 onCreate() 中检查捆绑对象的视频位置。视频位置可以保存在 onSaveInstanceState(Bundle) 中。参考developer.android.com/reference/android/app/Activity.html
    • 我看到的是视频从未来的某个时间开始。也许是下一帧,大约 1 秒。但是信息丢失了。有谁知道如何旋转而不丢失任何视频?
    【解决方案2】:

    将configChanges 属性添加到您的清单意味着您将handle config changes yourself。在您的活动中覆盖onConfigurationChanged() 方法:

    int lastOrientation = 0;
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    
        // Checks if orientation changed
        if (lastOrientation != newConfig.orientation) {
            lastOrientation = newConfig.orientation;
            // redraw your controls here
        } 
    }
    

    【讨论】:

    • 哦,好的,明白了!我只是在我的第二周 java 如此光秃秃的......我现在如何重绘控件?我尝试了mVideoView.refreshDrawableState();,但失败了。我不知道用什么方法重绘它们。
    • 您不想重新创建整个视图,因为这会杀死视频播放器。您只需更换需要更改的部件(控件)并保持播放器完好无损。基本上你会:定位父视图组(布局),获取要替换的视图的位置(索引),删除它们,膨胀新的,添加到相同的位置:stackoverflow.com/questions/3334048/…
    • 我使用的是标准的 MediaController。我不想改变任何布局。它是需要重绘的内置视频控件。我发布了正在发生的事情的视频:youtube.com/watch?v=FgRythmUo3A
    • 看完视频有什么想法吗?
    【解决方案3】:

    添加

    android:configChanges="orientation"

    到 AndroidManifest.xml 中的 Activity。

    • 解决了我不会再次下载渐进式视频的问题..

    如果您的目标 API 级别为 13 或更高,则除了orientation 值之外,您还必须包含screenSize 值,如here 所述。所以你的标签可能看起来像

    android:configChanges="orientation|screenSize"
    

    【讨论】:

      【解决方案4】:

      ConfigChanges 是对的,但它确实是这样工作的;

          <activity
              android:configChanges="orientation|screenSize" ... >
      

      也在活动类中

      @Override
      public void onConfigurationChanged(Configuration newConfig) {
          super.onConfigurationChanged(newConfig);
          if (lastOrientation != newConfig.orientation) {
              lastOrientation = newConfig.orientation;
              // redraw your controls here
          } 
      }
      

      【讨论】:

        【解决方案5】:

        你应该试试这个。转到您的 AndroidManifest.xml 文件,然后通过它标记。

        <activity android:name=".activity_name"
         android:configChanges="keyboardHidden|orientation|screenSize">
        </activity>
        

        【讨论】:

        • 我在 7 年前问过这个问题,所以我确信事情已经发生了变化。不过,感谢您的回复。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多