YouTube Android API:YouTubePlayerFragment 加载微调器

Posted

技术标签:

【中文标题】YouTube Android API:YouTubePlayerFragment 加载微调器【英文标题】:YouTube Android API: YouTubePlayerFragment loading spinner 【发布时间】:2016-05-18 04:13:35 【问题描述】:

我正在使用 android YouTube API 示例在我的应用中创建一个无铬的 YouTube 播放器。我遇到了一个问题,即缓冲/加载进度条在我的视频上继续显示,即使它已经加载并开始播放。我可以在FragmentDemoActivity 示例中重现这一点,并进行一些小的修改:

public class FragmentDemoActivity extends AppCompatActivity implements YouTubePlayer.OnInitializedListener 

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragments_demo);

        YouTubePlayerFragment youTubePlayerFragment =
            (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtube_fragment);
        youTubePlayerFragment.initialize(DeveloperKey.DEVELOPER_KEY, this);
    

    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player,
          boolean wasRestored) 
        if (!wasRestored) 
            player.setPlayerStyle(YouTubePlayer.PlayerStyle.CHROMELESS);
            player.loadVideo("nCgQDjiotG0", 10);
        
    

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


我已将FragmentDemoActivity 更改为从AppCompatActivity 继承而不是YouTubeFailureRecoveryActivity,正如文档中所说的那样。我还在onInitializationSuccess 中将播放器样式更改为无铬。最后我把cueVideo改成了loadVideo,就是为了触发自动播放。

这发生在包括 Nexus 5X 在内的多台设备上。我正在使用库版本 1.2.2。 onInitializationFailure 中没有触发错误。

视频在缓冲后开始播放。播放器是无铬的。然而,缓冲微调器永远不会消失。这是一个错误,还是我在做一些我不允许做的事情?

【问题讨论】:

这似乎是 ***.com/questions/35202945/… 的副本,但希望有一段可复制的代码可以使用。 【参考方案1】:

我也遇到过,真的是个bug。以下是我设法解决它的方法。

在您的onInitializationSuccess 中,在player 上设置PlaybackEventListener。覆盖 onBuffering 并执行以下操作:

ViewGroup ytView = (ViewGroup)ytPlayerFragment.getView();
ProgressBar progressBar;
try 
    // As of 2016-02-16, the ProgressBar is at position 0 -> 3 -> 2 in the view tree of the Youtube Player Fragment
    ViewGroup child1 = (ViewGroup)ytView.getChildAt(0);
    ViewGroup child2 = (ViewGroup)child1.getChildAt(3);
    progressBar = (ProgressBar)child2.getChildAt(2);
 catch (Throwable t) 
    // As its position may change, we fallback to looking for it
    progressBar = findProgressBar(ytView);
    // TODO I recommend reporting this problem so that you can update the code in the try branch: direct access is more efficient than searching for it


int visibility = isBuffering ? View.VISIBLE : View.INVISIBLE;
if (progressBar != null) 
    progressBar.setVisibility(visibility);
    // Note that you could store the ProgressBar instance somewhere from here, and use that later instead of accessing it again.

findProgressBar 方法,用作备用方法,以防 YouTube 代码更改:

private ProgressBar findProgressBar(View view) 
    if (view instanceof ProgressBar) 
        return (ProgressBar)view;
     else if (view instanceof ViewGroup) 
        ViewGroup viewGroup = (ViewGroup)view;
        for (int i = 0; i < viewGroup.getChildCount(); i++) 
            ProgressBar res = findProgressBar(viewGroup.getChildAt(i));
            if (res != null) return res;
        
    
    return null;

这个解决方案对我来说非常有效,在播放器缓冲时启用ProgressBar,在不缓冲时禁用它。

编辑:如果使用此解决方案的任何人发现此错误已修复或ProgressBar 的位置已更改,请分享以便我可以编辑我的答案,谢谢!

【讨论】:

是的!这个解决方法对我有用——我会一直使用到他们修复错误为止。非常感谢!

以上是关于YouTube Android API:YouTubePlayerFragment 加载微调器的主要内容,如果未能解决你的问题,请参考以下文章

使用 android 意图在特定时间打开 youtube 视频

如何通过 Android 应用程序的链接重定向到 youtube 应用程序?

突然在 YouTube V3 API 上获得 Oauth 2.0 同意的 403(禁止)

如何获得 Youtube 频道的订阅者数量?

YouTube Data API v3 在生产服务器上部署时不起作用 [关闭]

强制为 YouTube 提供高质量缩略图