旋转手机会重新启动安卓视频。

10

当我旋转我的手机时,我的活动重新启动。我有一个视频视图正在播放视频,我旋转后视频重新开始播放。现在我发现在清单中将此添加到我的活动中可以解决问题。


当我旋转手机时,我的Activity会重新启动。我有一个正在播放视频的VideoView,旋转手机后视频会重新开始播放。现在我发现在清单文件中为我的Activity添加以下内容可以解决这个问题。
<activity android:name="Vforum" android:configChanges="orientation"></activity>

现在的问题是视频控件只有在消失并重新出现时才会被重绘,这样就会导致控件要么非常长(从横屏模式转换为竖屏模式),要么非常短(从竖屏模式转换为横屏模式)。一旦它们消失,我再次点击让它们返回,那么它们就会正确地调整大小。是否有更好的方法来解决这个问题?

5个回答

27

在AndroidManifest.xml中为你的Activity添加 android:configChanges="orientation"

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

如果您的目标API级别为13或更高版本,则必须包括 screenSize 值,除了像这里所描述的orientation值。因此,您的标记可能如下所示:

android:configChanges="orientation|screenSize"

3
考虑在活动生命周期事件中记住视频文件位置。当创建活动时,您可以获取视频位置并从重新启动的那一刻开始播放它。
在您的活动类中:
@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() 将保存当前时间,但当我旋转并重置时,我也看到渐进式下载重新开始了。你能提供一个简单的例子吗?伪代码对我来说甚至也可以,谢谢! - Ronnie
当您旋转手机时,当前的Activity实例会被销毁并创建一个新实例,因此您可以在onCreate()方法中检查bundle对象以获取视频位置。视频位置可以在onSaveInstanceState(Bundle)方法中保存。请参考http://developer.android.com/reference/android/app/Activity.html。 - user468311
我看到的是视频从未来的某个时间开始。也许是下一帧,大约1秒钟左右。但信息丢失了。有人知道如何旋转而不会丢失任何视频吗? - Lucy

1

在您的清单中添加configChanges属性意味着您将自行处理配置更改。在您的活动中覆盖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();但失败了。我不知道哪个方法可以重新绘制它们。 - Ronnie
您不想重新创建整个视图,因为这将会影响视频播放器。您只需要替换需要更改的部分(控件),并保留播放器不变。基本上,您需要:找到父视图组(布局),获取要替换的视图位置(索引),删除它们,填充新视图,并添加到相同的位置:https://dev59.com/nXA75IYBdhLWcg3wW3y8 - Peter Knego
我正在使用标准的MediaController。我不想改变任何布局。需要重新绘制内置视频控件。我发布了一个视频,展示了发生了什么:http://www.youtube.com/watch?v=FgRythmUo3A - Ronnie
看完视频后有什么想法吗? - Ronnie

0

你应该尝试这个。转到你的 AndroidManifest.xml 文件,然后粘贴它的标签。

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

我7年前问过这个问题,所以我相信情况已经改变了。不过,还是谢谢你的回答。 - Ronnie

0

ConfigChanges 是正确的,但它的工作方式是这样的;

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

还有在Activity类中

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接