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

Unable to play some Youtube videos using YouTube Android Player API

例如,此视频无法使用 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

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

youtubePlayer.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CONTROL_SYSTEM_UI);

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

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

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

原因:我不确定,但我认为这与 YouTubeAndroidPlayerAPI 1.2.1 中广为人知的 YoutubePlayerSupport 片段的巨大内存泄漏问题有关在 google data api issue tracker 中报告。它终于在上个月的 9 月 1 日(至少目前的状态是这样说的)在报告一年后修复(惊讶地看到 google 花了这么长时间)。但是 google 尚未推出带有修复程序的新版 YouTubeAndroidPlayerAPI。所以也许他们在 9 月份修复了 youtube 应用程序中的内存问题,这在某种程度上破坏了 YouTubeAndroidPlayerAPI 1.2.1 的功能(自 YouTubeAndroidPlayerAPI 直接依赖于 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 Player API has just been released 版本 1.2.2。它可能会解决您遇到的视频播放问题。

android:screenOrientation="风景">

如果你没有添加方向将不起作用。方向是 must.otherwise 会显示为正在加载,不会播放 !