无法使用 YouTube Android Player API 播放某些 Youtube 视频

Posted

技术标签:

【中文标题】无法使用 YouTube Android Player API 播放某些 Youtube 视频【英文标题】:Unable to play some Youtube videos using YouTube Android Player API 【发布时间】:2015-12-23 10:28:51 【问题描述】:

例如此视频无法使用 Youtube 播放器 API 播放:https://www.youtube.com/watch?v=OLK1efdt3n8(搜索响应中的其他视频正常)

我收到以下消息:

09-25 17:18:50.226  24280-24280/com.mypackagename W/YouTubeandroidPlayerAPI﹕ Cannot load modern controls UI. Upgrade to the latest version of the Android YouTube API.
09-25 17:19:05.911  24280-24280/com.mypackagename E/YoutubePlayerFragment﹕ video error : INTERNAL_ERROR

YouTubePlayer API 版本:1.2.1(最新)

设备上的 YouTube 应用是最新的并且可以播放此视频

视频参数:videoEmbeddable=true videoSyndicated=true

【问题讨论】:

你的 YouTube 播放器是什么风格的? @dextor ,它使用YouTubePlayer.PlayerStyle.MINIMAL 你试过其他的(包括NONE)吗?只是看看这是否会改变什么。 @dextor,现在会检查它,它有 3 个选项:CHROMELESS、DEFAULT、MINIMAL 你尝试过改变风格吗?这会带来不同的结果吗?另外,您设备上的 YouTube 应用版本是多少? 【参考方案1】:

android:screenOrientation="landscape">

如果您不添加方向将不起作用。方向是必须的。否则会显示为加载,不会播放!

【讨论】:

【参考方案2】:

1.2.2 版 YouTube 播放器 API has just been released。它可能会解决您遇到的视频播放问题。

【讨论】:

试过了,没有解决任何问题。这真的很糟糕,我的应用现在对任何更新了他们的 Youtube 应用的人来说完全没用。 最新版本 1.2.2 中没有任何反应,我仍在等待解决方案。【参考方案3】:

嘿,这就是我在我的应用中实现的,用于播放管视频

    public class Youtubevideo  extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener


    public static final String API_KEY = "Use Your API key For youtube api";

    //http://youtu.be/<VIDEO_ID>
      //sample video id
    public  String VIDEO_ID = "abcdefgh";

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        /** attaching layout xml **/
        setContentView(R.layout.youtubevideo);
       Intent dataReceived = getIntent();
        if(dataReceived != null)
        
           VIDEO_ID = dataReceived.getStringExtra("url");

        
        /** Initializing YouTube player view **/
        YouTubePlayerView youTubePlayerView = (YouTubePlayerView) findViewById(R.id.youtube_player);
        youTubePlayerView.initialize(API_KEY, this);
    

    @Override
    public void onInitializationFailure(Provider provider, YouTubeInitializationResult result) 
        Toast.makeText(this, "Failured to Initialize!", Toast.LENGTH_LONG).show();
    

    @Override
    public void onInitializationSuccess(Provider provider, YouTubePlayer player, boolean wasRestored) 
        /** add listeners to YouTubePlayer instance **/
        //player.setPlayerStateChangeListener(playerStateChangeListener);
        //player.setPlaybackEventListener(playbackEventListener);
        player.setFullscreen(true);
        player.setShowFullscreenButton(true);
        /** Start buffering **/
        if (!wasRestored) 
            player.cueVideo(VIDEO_ID);
        
    

    private PlaybackEventListener playbackEventListener = new PlaybackEventListener() 

        @Override
        public void onBuffering(boolean arg0) 
        

        @Override
        public void onPaused() 
        

        @Override
        public void onPlaying() 
        

        @Override
        public void onSeekTo(int arg0) 
        

        @Override
        public void onStopped() 
        

    ;

    private PlayerStateChangeListener playerStateChangeListener = new PlayerStateChangeListener() 

        @Override
        public void onAdStarted() 
        

        @Override
        public void onError(ErrorReason arg0) 
        

        @Override
        public void onLoaded(String arg0) 
        

        @Override
        public void onLoading() 
        

        @Override
        public void onVideoEnded() 
        

        @Override
        public void onVideoStarted() 
        
    ;



xml 会是这样的:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical" >

    <com.google.android.youtube.player.YouTubePlayerView
        android:id="@+id/youtube_player"
        android:layout_
        android:layout_
        android:background="#fff"
        android:padding="5dp" />

</LinearLayout>

并在 build.gradle 中使用公开可用的 Youtube jar 库:

compile files('libs/YouTubeAndroidPlayerApi.jar')

希望这会有所帮助。 :)

【讨论】:

您为什么使用 YouTube 播放器 jar 而不是 Gradle? @IgorGanapolsky 您在哪里看到对 Gradle 的依赖?我还没有找到它。 @Jawnnypoo 自 Android Studio 发布以来,我还没有看到有人在 Android Studio 中使用 jar :) @IgorGanapolsky 是的,我也非常支持 Gradle 依赖项,但您的评论暗示 YouTubePlayer 库可以通过 jar 以外的方式使用,但事实并非如此。 developers.google.com/youtube/android/player/downloads【参考方案4】:

对我来说,问题是我只能播放一次视频,但之后 YouTubePlayer 不会播放任何视频,我希望 many other people 也面临与 YouTubeAndroidPlayerAPI 类似的问题。我认为最新的 youtube 应用(版本 10.37.58)和 YouTubeAndroidPlayerAPI 1.2.1 不兼容。

据我所知您目前唯一可以解决此问题的方法是将设备上安装的 youtube 应用降级到 10.36.52 或更低版本。 (可以从apk mirror获取)

我在使用 YouTubeAndroidPlayerAPI 时注意到的是,在 youtube 版本 10.36.52 中,它会抛出警告消息“无法加载现代控件 UI。升级到最新版本的 Android YouTube API。 " 每次我尝试播放视频时都会在 logcat 上显示,但其他工作正常。对于 10.35.53 及以下版本,不会引发此类警告消息。

原因:我不确定,但我认为这与 YouTubeAndroidPlayerAPI 1.2.1 中的 YoutubePlayerSupport 片段的巨大内存泄漏问题有关,该片段广为人知并在 google data api issue tracker 中报告。它终于在上个月的 9 月 1 日得到修复(至少目前的状态是这样的),在它被报道一年后(惊讶地看到谷歌花了这么长时间)。然而,谷歌尚未推出带有修复程序的新版 YouTubeAndroidPlayerAPI。因此,也许他们在 9 月份修复了 youtube 应用程序中的内存问题,这在某种程度上破坏了 YouTubeAndroidPlayerAPI 1.2.1 的功能(因为 YouTubeAndroidPlayerAPI 直接依赖于 youtube 应用程序才能工作)。

【讨论】:

【参考方案5】:

这很奇怪!我只能建议你玩一些flags 看看是否有一些组合可以解决问题。我将从以下内容开始:

youtubePlayer.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CONTROL_SYSTEM_UI);

【讨论】:

没有帮助,当我使用 YouTubePlayerSupportFragment 时会出现这些消息,而 YouTubePlayerFragment 工作正常。但是我的整个应用都带有 AppCompat/Support 片段 无关答案

以上是关于无法使用 YouTube Android Player API 播放某些 Youtube 视频的主要内容,如果未能解决你的问题,请参考以下文章

selenium:无法自动化youTube的播放暂停和放大

无法使用 YouTube Android Player API 播放某些 Youtube 视频

Android libGDX:使用 google-play-services_lib 时 Eclipse 崩溃

请求中使用了 Cookie 标头,但无法找到 YouTube 身份令牌

android - 无法加载多个YouTube视频

无法通过 fastlane 使用 Google Play 应用签名将 android 包上传到 Google Play