Unable to play exoPlayer in full screen with setOnClickListener

Viewed 810

By default video will be playing in portrait mode and when imageView1.setOnClickListener is clicked it video should play in full_screen.xml

But in my case i can't play video in full_screen.xml, I have also added <activity android:name=".Activities.FullScreen"></activity> in AndroidManifest still no success.

FYI : when full_screen activity opens and returns to main_activity so why video is not playing in full_screen_activity

here is VideoPlayerActivity.java

    public class VideoPlayerActivity extends AppCompatActivity {

    Uri videoUri;
    @BindView(R.id.playerView) PlayerView playerView;
    @BindView(R.id.floating_widget) ImageView imageView;
    @BindView(R.id.full_screen) ImageView imageView1;

    ExoPlayer exoPlayer;
    ExtractorsFactory extractorsFactory;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_player);
        ButterKnife.bind(this);
        Intent intent = getIntent();

        if (intent!=null){
            String uri_str = intent.getStringExtra("videoUri");
            videoUri = Uri.parse(uri_str);
        }

        imageView1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                exoPlayer.setPlayWhenReady(false);
                exoPlayer.release();
                Intent serviceIntent2 = new Intent(VideoPlayerActivity.this,FullScreen.class);
                serviceIntent2.putExtra("videoUri",videoUri.toString());
                startActivity(serviceIntent2);
            }
        });

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                exoPlayer.setPlayWhenReady(false);
                exoPlayer.release();
                Intent serviceIntent = new Intent(VideoPlayerActivity.this,FloatingWidgetService.class);
                serviceIntent.putExtra("videoUri",videoUri.toString());
                startService(serviceIntent);
            }
        });

        BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();

        TrackSelector trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthMeter));
        exoPlayer = ExoPlayerFactory.newSimpleInstance(this,trackSelector);
        extractorsFactory = new DefaultExtractorsFactory();
        playVideo();

    }

    private void playVideo() {
        try {
            String playerInfo = Util.getUserAgent(this,"VideoPlayer");
            DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(this,playerInfo);

            MediaSource mediaSource = new ExtractorMediaSource(videoUri,dataSourceFactory,extractorsFactory,null,null);

            playerView.setPlayer(exoPlayer);
            exoPlayer.prepare(mediaSource);
            exoPlayer.setPlayWhenReady(true);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        exoPlayer.setPlayWhenReady(false);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        exoPlayer.setPlayWhenReady(false);
        exoPlayer.release();
    }
}

And here FullScreen.java

package com.sanoj.jlplayer.Activities;

public class FullScreen extends AppCompatActivity {

    @BindView(R.id.fullscreenPlayer) PlayerView playerView;

    ExoPlayer exoPlayer;
    ExtractorsFactory extractorsFactory;

    Uri videoUri;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ButterKnife.bind(this);
        Intent intent = getIntent();

        if (intent!=null){
            String uri_str = intent.getStringExtra("videoUri");
            videoUri = Uri.parse(uri_str);
        }

        BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();

        TrackSelector trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthMeter));
        exoPlayer = ExoPlayerFactory.newSimpleInstance(this,trackSelector);
        extractorsFactory = new DefaultExtractorsFactory();
        playVideo();
    }


    private void playVideo() {
        try {
            String playerInfo = Util.getUserAgent(this,"Fullscreen");
            DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(this,playerInfo);

            MediaSource mediaSource = new ExtractorMediaSource(videoUri,dataSourceFactory,extractorsFactory,null,null);

            playerView.setPlayer(exoPlayer);
            exoPlayer.prepare(mediaSource);
            exoPlayer.setPlayWhenReady(true);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        exoPlayer.setPlayWhenReady(false);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        exoPlayer.setPlayWhenReady(false);
        exoPlayer.release();
    }
}

Can some one help what wrong i have made.

Update:

Here is full_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Activities.FullScreen">


    <com.google.android.exoplayer2.ui.PlayerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/fullscreenPlayer"
        app:controller_layout_id="@layout/exo_playback_control_view"
        app:use_controller="true">

    </com.google.android.exoplayer2.ui.PlayerView>

</RelativeLayout>

bounty update i want to add full screen option in my exoplayer project and above is code i did to add full screen, But when i click onclickListner it moves to main _activity,

What show i do to add full_screen_option.

2 Answers

I hope this code will help you I use data binding instead of findviewbyid.

 fullscreenButton.setOnClickListener(view -> {
            if (fullscreen) {
                exitFullSscreen(fullscreenButton);
            } else {
                binding.llToolbar.setVisibility(View.GONE);

                fullscreenButton.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_fullscreen_black_24dp));
                getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) binding.videoFullScreenPlayer.getLayoutParams();
                params.width = ViewGroup.LayoutParams.MATCH_PARENT;
                params.height = ViewGroup.LayoutParams.MATCH_PARENT;
                params.setMargins(0, 0, 0, 0);
                binding.videoFullScreenPlayer.setLayoutParams(params);
                fullscreen = true;
            }
        });



private void exitFullSscreen(ImageView fullscreenButton) {

    fullscreenButton.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_fullscreen_black_24dp));
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
    if (getSupportActionBar() != null) {
        getSupportActionBar().show();
    }
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    // set video height
    setLayoutHeight(binding.videoFullScreenPlayer);

    binding.llToolbar.setVisibility(View.VISIBLE);
    fullscreen = false;


}



 private void setLayoutHeight(View layout) {

        float height = getResources().getDimension(R.dimen.video_height);
        ViewGroup.LayoutParams params = layout.getLayoutParams();
        params.width = ViewGroup.LayoutParams.MATCH_PARENT;
        params.height = ViewGroup.LayoutParams.MATCH_PARENT;
        layout.setLayoutParams(params);
    }

Update ->>>

       <com.google.android.exoplayer2.ui.PlayerView
            android:id="@+id/videoFullScreenPlayer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#A6000000"
            android:visibility="gone"
            app:auto_show="true"
            app:controller_layout_id="@layout/exo_playback_control_view_full"
            app:player_layout_id="@layout/exo_simple_player_view"
            app:repeat_toggle_modes="none"
            app:resize_mode="fit"
            app:show_timeout="5000"
            app:surface_type="texture_view"

            />

TL;DR: So far I've found 2 options to make exoplayer fullscreen, they are on my public github if you'd like to see the full source code.

First solution

You use a DialogFragment to take the whole screen, I've noticed some latency with old phones so make sure you test it first. Basically all you need is to put your playerView in a frameLayout

ActivityMain.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:id="@+id/main_media_frame"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.5"
        android:background="#000000">

        <com.google.android.exoplayer2.ui.PlayerView
            android:id="@+id/player_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center" />

    </FrameLayout>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.5"
        android:background="#757575"
        android:gravity="center"
        android:text="Nothing"
        android:textColor="#FFFFFF"
        android:textSize="24sp" />

</LinearLayout>

MainActivity

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initFullScreenDialog()
        initFullScreenButton()
        ...
    }

private fun initFullScreenDialog() {
        fullscreenDialog = object: Dialog(this, android.R.style.Theme_Black_NoTitleBar_Fullscreen) {
            override fun onBackPressed() {
                if(isFullscreen) closeFullscreenDialog()
                super.onBackPressed()
            }
        }
    }

    private fun initFullScreenButton(){
        exo_fullscreen_button.setOnClickListener {
            if (!isFullscreen) {
                openFullscreenDialog()
            } else {
                closeFullscreenDialog()
            }
        }
    }

    @SuppressLint("SourceLockedOrientationActivity")
    private fun openFullscreenDialog() {
        exo_fullscreen_icon.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_fullscreen_shrink))
        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
        (player_view.parent as ViewGroup).removeView(player_view)
        fullscreenDialog?.addContentView(player_view, ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT))
        isFullscreen = true
        fullscreenDialog?.show()
    }

    private fun closeFullscreenDialog() {
        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR
        (player_view.parent as ViewGroup).removeView(player_view)
        (main_media_frame as FrameLayout).addView(player_view)
        exo_fullscreen_icon.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_fullscreen_expand))
        isFullscreen = false
        fullscreenDialog?.dismiss()
    }

Second solution

Modifying your layout using LayoutParams

ActivityMain.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/player_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.5"
        android:gravity="center" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.5"
        android:background="#757575"
        android:gravity="center"
        android:text="Nothing"
        android:textColor="#FFFFFF"
        android:textSize="24sp" />
</LinearLayout>

ActivityMain

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initFullScreenButton()
        ...
    }

private fun initFullScreenButton(){
        exo_fullscreen_button.setOnClickListener {
            if (!isFullscreen) {
                openFullscreen()
            } else {
                closeFullscreen()
            }
        }
    }

    @SuppressLint("SourceLockedOrientationActivity")
    private fun openFullscreen(){
        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
        exo_fullscreen_icon.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_fullscreen_shrink))
        player_view.setBackgroundColor(ContextCompat.getColor(this, R.color.colorBlack))
        val params: LinearLayout.LayoutParams = player_view.layoutParams as LinearLayout.LayoutParams
        params.width = LinearLayout.LayoutParams.MATCH_PARENT
        params.height = LinearLayout.LayoutParams.MATCH_PARENT
        player_view.layoutParams = params
        supportActionBar?.hide()
        hideSystemUi()
        isFullscreen = true
    }

    private fun closeFullscreen() {
        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR
        exo_fullscreen_icon.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_fullscreen_expand))
        player_view.setBackgroundColor(ContextCompat.getColor(this, R.color.colorWhite))
        val params: LinearLayout.LayoutParams = player_view.layoutParams as LinearLayout.LayoutParams
        params.width = LinearLayout.LayoutParams.MATCH_PARENT
        params.height = 0
        player_view.layoutParams = params
        supportActionBar?.show()
        player_view.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
        isFullscreen = false
    }

    private fun hideSystemUi() {
        player_view?.systemUiVisibility = (
                View.SYSTEM_UI_FLAG_IMMERSIVE
                        or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_FULLSCREEN)
    }

Related