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

18
例如,使用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

YouTube播放器API版本:1.2.1(最新)

设备上的YouTube应用程序已经更新并能够播放此视频

视频参数:videoEmbeddable=true videoSyndicated=true


你的YouTubePlayer使用了哪种样式? - Sebastiano
@dextor,它使用YouTubePlayer.PlayerStyle.MINIMAL - Mickey Tin
你有试过其他的吗(包括没有)?只是为了看看是否会有什么变化。 - Sebastiano
@dextor,我现在会检查它,它有三个选项:CHROMELESS,DEFAULT和MINIMAL。 - Mickey Tin
@dextor,是的,我已经尝试过了,没有结果。我的YouTube应用程序版本是10.37.58。 - Mickey Tin
显示剩余2条评论
5个回答

13

对我来说,问题在于我只能播放一次视频,之后YouTubePlayer就无法播放任何视频了。我希望还有许多其他人也遇到了与YouTubeAndroidPlayerAPI相似的问题。 我认为最新的YouTube应用程序(版本10.37.58)和YouTubeAndroidPlayerAPI 1.2.1 不兼容。

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

从我使用YouTubeAndroidPlayerAPI时注意到的情况来看,使用YouTube版本10.36.52会在每次尝试播放视频时在logcat上抛出警告信息“无法加载现代控件UI。 升级到Android YouTube API的最新版本。”,但是除此之外一切正常。而在10.35.53及以下版本中则不会抛出此警告信息。

原因:我不确定,但我认为这与YouTubeAndroidPlayerAPI 1.2.1中的YoutubePlayerSupport fragment的巨大内存泄漏问题有关,该问题在google data api issue tracker中广为人知并报告。自从它被报告以来过去了一年,在9月1日(至少当前状态是这样)终于解决了。然而,谷歌还没有推出具有修复程序的新版本YouTubeAndroidPlayerAPI。 因此,也许他们在9月份就在youtube应用程序中解决了该内存问题,但某种方式破坏了YouTubeAndroidPlayerAPI 1.2.1的功能(因为YouTubeAndroidPlayerAPI直接依赖于youtube应用程序才能工作)。


1

YouTube播放器API的1.2.2版本刚刚发布。它可能解决您遇到的视频播放问题。


1
尝试过了,没有解决任何问题。这真的很糟糕,我的应用现在对于那些更新了他们的YouTube应用程序的人来说完全无用。 - user3564573
最新版本1.2.2没有任何反应,我仍在等待解决方案。 - Umer

1

<activity android:name=".ui.activity.PlayerActivity" android:screenOrientation="landscape">

如果您没有添加屏幕方向,将无法正常工作。方向是必须的,否则会显示为加载,无法播放!


0

嘿,这是我在我的应用程序中实现的YouTube视频播放功能

    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_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

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

</LinearLayout>

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

compile files('libs/YouTubeAndroidPlayerApi.jar')

希望这能有所帮助。 :)

你为什么要使用YouTube播放器jar而不是Gradle? - IgorGanapolsky
3
@IgorGanapolsky,您认为Gradle的依赖在哪里?我还没有找到它。 - Jawnnypoo
@Jawnnypoo 自从 Android Studio 发布以来,我就没见过有人在 Android Studio 中使用 JAR 包 :) - IgorGanapolsky
4
是的,我也非常支持使用Gradle依赖项,但是你的评论暗示着YouTubePlayer库可以以其他方式获取,实际上并不是这样,它只能通过jar包获得。https://developers.google.com/youtube/android/player/downloads/ - Jawnnypoo

-2

这很奇怪!我只能建议你尝试一些标志,看看是否有某些组合可以解决问题。我将从以下开始:

youtubePlayer.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CONTROL_SYSTEM_UI);

当我使用YouTubePlayerSupportFragment时,出现了这些消息,而使用YouTubePlayerFragment则正常。但我的整个应用程序都是使用AppCompat/Support fragments构建的,这并没有帮助到我。 - Mickey Tin
irrelevant answer - Jivraj S Shekhawat

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