在旋转具有不同方向布局的设备时继续播放 YouTube 播放器

Posted

技术标签:

【中文标题】在旋转具有不同方向布局的设备时继续播放 YouTube 播放器【英文标题】:Continue playback of YouTube player while rotating device with separate orientation layouts 【发布时间】:2017-12-02 08:29:09 【问题描述】:

我正在尝试将包含 YouTube 播放器的视图添加到旋转设备时继续播放的 Activity。由于 UI 不仅仅包含视频,因此我使用的是 YouTubePlayerFragment

当方向从纵向变为横向时,系统应使用不同的布局文件。此布局还包括 YouTube 播放器作为不占用整个屏幕的视图。您将在下面找到重现问题的最少代码(对于新的 android 应用,最低 API 级别 19)。

package com.example.youtubefragmenttest;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.google.android.youtube.player.YouTubeInitializationResult;
import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayerFragment;

public class MainActivity extends AppCompatActivity implements YouTubePlayer.OnInitializedListener 

    private static final String YOUTUBE_DEV_KEY = "[your youtube dev key here]";

    private static final String TAG_YOUTUBE_FRAGMENT = "YoutubePlayerFragment";

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

        FragmentManager fm = getFragmentManager();
        YouTubePlayerFragment retainedYoutubeFragment = (YouTubePlayerFragment) fm.findFragmentByTag(TAG_YOUTUBE_FRAGMENT);
        if (retainedYoutubeFragment == null) 
            retainedYoutubeFragment = YouTubePlayerFragment.newInstance();
            retainedYoutubeFragment.setRetainInstance(true);
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.add(R.id.youtube_fragment, retainedYoutubeFragment, TAG_YOUTUBE_FRAGMENT);
            fragmentTransaction.commit();
        
        retainedYoutubeFragment.initialize(YOUTUBE_DEV_KEY, this);
    

    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) 

        if (!wasRestored) 
            youTubePlayer.cueVideo("um4TrbU2Eic");
        
    

    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) 

    

这是布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context="com.example.youtubefragmenttest.MainActivity">

    <FrameLayout
        android:id="@+id/youtube_fragment"
        android:layout_
        android:layout_
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent" />

</android.support.constraint.ConstraintLayout>

我知道 YouTubePlayer API 的开发人员建议手动处理方向更改。这也是How to retain instance of fragment of fragment playing video after change in orientation? 中公认的答案。不幸的是,这对我不起作用,因为纵向视图和横向视图的布局之间存在太多复杂的差异。

文档提示了一种解决此问题的方法,使得回调方法 onInitializationSuccess 中的 boolean wasRestoredtrue,但这是实际问题:上面代码中的 wasRestored 始终是 em> false.

底线:如何让 YouTube 播放器在方向变化时继续播放,同时保持每个方向的单独布局(这是与链接问题的主要区别)?

【问题讨论】:

您是否正在专门寻找使用 YoutubePlayerFragment 的解决方案?如果您有兴趣,我已经使用 YoutubeBaseActivity 做了类似的事情。我使用线性布局,根据方向将方向从水平切换到垂直。随着方向的变化(以及切换到全屏时),视频会继续播放。我想我从示例代码中获取了基本思想,然后就用它运行了。如果您还没有看过,也许developers.google.com/youtube/android/player/… 也可以给您一些想法。 我使用YouTubePlayerFragment,因为播放器只是 UI 的一小部分。此外,YouTubeBaseActivity 从 UI 中删除了操作栏,同时对布局进行了一些其他更改。我已经检查了您提到的示例应用程序,但少数具有我希望手动处理方向更改的视觉功能。所以不幸的是,这不是一个选择。 【参考方案1】:

onInitializationSuccess 返回一个YoutubePlayer 对象,该对象在getCurrentTimeMillis() 上有一个函数。将此对象保存为 onInitializationSuccess 内的活动实例 (this.player = youTubePlayer)。在activity被销毁之前(oPause/onStop),获取当前时间并传递给要存储的保留片段。

【讨论】:

从技术上讲,这可行,但它不是一个可接受的解决方案:由于视频是重新加载而不是恢复,它可能会导致 YouTube 广告再次开始播放。 啊,这可能是个问题

以上是关于在旋转具有不同方向布局的设备时继续播放 YouTube 播放器的主要内容,如果未能解决你的问题,请参考以下文章

自动布局:UIImageView 不随设备方向旋转

当方向改变而不旋转布局时如何旋转按钮?

处理旋转时更改的 iOS 键盘布局

Xcode 自动布局和旋转

ScrollView 自动布局约束打破设备旋转

当项目具有动态高度时,如何根据设备方向创建动态颤动网格布局