YouTube播放器播放2秒钟并全屏停止

时间:2015-04-26 05:16:30

标签: android android-youtube-api

我目前面临两个主要问题,

  1. 我正在使用youtube播放器,当它全屏显示时,播放1-2秒并停止播放。

  2. 当我点击中间的“播放”按钮时,它会再次缓冲。即使灰色条填充到它的中心。

  3. 纵向模式下没有出现这些问题。

    这是我的课程,就像有点干扰的youtube api演示

    public class Video extends YouTubeFailureRecoveryActivity implements YouTubePlayer.OnFullscreenListener, Utils.OnGetUrlListener, View.OnClickListener {
    
        static int AUTO_PLAY_DELAY = 1000;
    
        static final int PORTRAIT_ORIENTATION = Build.VERSION.SDK_INT < 9
                ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                : ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT;
    
        private LinearLayout mRootLayout;
    
        /**
         * * Youtube ***
         */
        YouTubePlayerView mPlayerView;
        YouTubePlayer mPlayer;
        boolean mIsFullscreen;
        String urlID;
    
        /**
         * * My ***
         */
        RelativeLayout mContainer;
        ImageView mBtPlay;
        boolean mIsNeedSetFlags;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Utils.getInstance().setActivity(this);
    
            setContentView(R.layout.video_main);
            mIsNeedSetFlags = true;
    
    
    
            mRootLayout = (LinearLayout) findViewById(R.id.video_root_layout);
    
           mContainer = (RelativeLayout) findViewById(R.id.container);
    
            mBtPlay = (ImageView) findViewById(R.id.video_play);
            mBtPlay.setVisibility(View.INVISIBLE);
    
            mPlayerView = (YouTubePlayerView) findViewById(R.id.player);
    
            Intent intent = getIntent();
    
    
            doLayout(); 
      }
    
    
        @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
            mPlayer = player;
    
            player.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT);
            player.setOnFullscreenListener(this);
    
            if (mIsNeedSetFlags) {
                mIsNeedSetFlags = false;
                int controlFlags = player.getFullscreenControlFlags();
                setRequestedOrientation(PORTRAIT_ORIENTATION);
                controlFlags |= YouTubePlayer.FULLSCREEN_FLAG_ALWAYS_FULLSCREEN_IN_LANDSCAPE;
                player.setFullscreenControlFlags(controlFlags);
            }
    
            if (!wasRestored) {
                player.cueVideo(urlID);
            }
        }
    
        @Override
        protected YouTubePlayer.Provider getYouTubePlayerProvider() {
            return mPlayerView;
        }
    
        private void doLayout() {
            LinearLayout.LayoutParams playerParams = (LinearLayout.LayoutParams) mPlayerView.getLayoutParams();
            if (mIsFullscreen) {
                playerParams.width = LinearLayout.LayoutParams.MATCH_PARENT;
                playerParams.height = LinearLayout.LayoutParams.MATCH_PARENT;
    
                mParallaxScrollView.setVisibility(View.GONE);
            } else {
                mParallaxScrollView.setVisibility(View.VISIBLE);
    
                if (getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
                    ViewGroup.LayoutParams otherViewsParams = mParallaxScrollView.getLayoutParams();
                    playerParams.width = otherViewsParams.width = MATCH_PARENT;
                    playerParams.height = WRAP_CONTENT;
                    mRootLayout.setOrientation(LinearLayout.VERTICAL);
                }
            }
            mPlayerView.setLayoutParams(playerParams);
        }
    
        @Override
        public void onFullscreen(boolean isFullscreen) {
            mIsFullscreen = isFullscreen;
            showPlayerAndPlay();
            doLayout();
        }
    
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            doLayout();
        }
    
        @Override
        public void onGetUrlFinished(String videoUrl) {
            urlID = videoUrl;
            mBtPlay.setVisibility(View.VISIBLE);
            mBtPlay.setOnClickListener(this);
            mPlayerView.initialize(Utils.YOU_TUBE_DEV_KEY, this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.video_play:
                    showPlayerAndPlay();
                    break;
            }
        }
    
    
        private void showPlayerAndPlay() {
            mPlayerView.setVisibility(View.VISIBLE);
            mBtPlay.setVisibility(View.INVISIBLE);
    
            if (!mPlayer.isPlaying())
                new android.os.Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mPlayer.play();
                    }
                }, AUTO_PLAY_DELAY);
        }
    }
    

3 个答案:

答案 0 :(得分:9)

YouTube不允许在其播放器视图之上叠加其他视图。

如果您检查日志,您还会看到一条警告消息,指出这个限制,以及有关哪个视图(其ID)和重叠区域的更多信息。

答案 1 :(得分:1)

一个很好的选择是使用Exoplayer,用视图覆盖您的视频。它不是android sdk的一部分,但谷歌推荐它并包含在android开发者文档中:

http://google.github.io/ExoPlayer/ https://developer.android.com/guide/topics/media/exoplayer.html

Exoplayer允许您传输任何类型的视频,而不仅仅是Youtubes视频。

在Youtube应用程序中使用Exoplayer也很不错。

答案 2 :(得分:0)

正如答案标记为正确解释:问题是覆盖了Youtube播放器视图的视图。 如果您需要保留这些视图,Youtube正在初始化,那么这将解决问题

我正在为涉及的视图执行带交叉淡化的加载动画。将alpha设置为0将无法解决问题,因为视图仍然存在。但是,设置GONEINVISIBLE的可见性确实有效。根据我的理解,View如果不是VISIBLE则不计算,至少在可见性改变后不会考虑它。最后,我做了类似的事情:

    myView.animate().alpha(0).setDuration(800).setListener(
        new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animator) {

                }

                @Override
                public void onAnimationEnd(Animator animator) {
                    myView.setVisibility(View.GONE);
                }

                @Override
                public void onAnimationCancel(Animator animator) {

                }

                @Override
                public void onAnimationRepeat(Animator animator) {

                }
            }).start();