mobihen
mobihen

Reputation: 335

YouTube Player plays for 2 seconds and stop in full screen

I'm currently facing 2 major problems,

  1. I'm using a youtube player and when it gets on full screen, It plays for 1-2 seconds and stop.

  2. When I click the "Play" button in the middle, it's buffering all over again. even if the gray bar filled to it's center.

those problems aren't occurring in portrait mode.

here is my class, like the youtube api demo with a bit defference

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);
    }
}

Upvotes: 4

Views: 3251

Answers (3)

cutiko
cutiko

Reputation: 10497

As the answer marked as correct explained: the problem is overlaying a view over the Youtube player view. If you need to keep those views will the Youtube is initializing then this will do the trick.

I was doing a loading animation with crossfade for the involved views. Setting alpha to 0 won't fix the issue because the view is still there. But setting visibility to GONE or INVISIBLE does work. For what I understand a View is not computed if is not VISIBLE, well at least it will not be taken into consideration after the visibility changed. Finally, I did something like this:

    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();

Upvotes: 0

Renaud Boulard
Renaud Boulard

Reputation: 709

A good alternative is to used Exoplayer, to overlay your video with view. It is not part of the android sdk, but it's recommended by google and included in android developer documentation :

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

Exoplayer allow you to stream any kind of video, not only Youtubes videos.

It's also good to mention that Exoplayer is used in Youtube application.

Upvotes: 1

Sebastiano
Sebastiano

Reputation: 12339

YouTube does not allow other views to be overlayed on top of its player view.

If you check the logs, you will also see a warning message that specifies this very limitation, plus more information on which view (its ID) and the overlapping region.

Upvotes: 9

Related Questions