Android Exoplayer SimpleExoPlayerView События воспроизведения / паузы

Есть ли способ подключиться к событиям нажатия Play / Pause элементов управления SimpleExoPlayerView? Я пытаюсь подключить chromecast к своей игровой деятельности, и мне нужно иметь возможность реагировать на события воспроизведения, чтобы определить, должен ли exoplayer воспроизводить контент или он должен быть отправлен в chromecast.

Я думал, что onPlayerStateChanged может помочь с этим, но я не вижу состояния ExoPlayer.STATE_PLAYING.


person Ryan Burnham    schedule 12.07.2017    source источник


Ответы (2)


Попробуйте это решение:

SimpleExoPlayerView simpleExoPlayerView = (SimpleExoPlayerView)findViewById(R.id.simpleExoView);
        simpleExoPlayerView.setControlDispatcher(new PlaybackControlView.ControlDispatcher() {
            @Override
            public boolean dispatchSetPlayWhenReady(ExoPlayer exoPlayer, boolean b) {

            // implement what you need

            return b;
        }

        @Override
        public boolean dispatchSeekTo(ExoPlayer exoPlayer, int i, long l) {
            return false;
        }
    });
person aborocz    schedule 12.07.2017
comment
Теоретически это должно решить мою проблему, но это некрасиво. Я надеялся реализовать что-то вроде State Machine в демонстрационном приложении Chromecast codelabs.developers.google.com/codelabs/cast-videos-android/#1. Помимо этого, это работает лишь частично. Демонстрационное приложение использует ExoPlayer.setPlayWhenReady во время onStart, но это обходит установленный нами dispatchSetPlayWhenReady SimpleExoPlayerView. Единственный раз, когда срабатывает dispatchSetPlayWhenReady, - это после его первоначальной загрузки и нажатия кнопки воспроизведения. И я не вижу SimpleExoPlayerView.setPlayWhenReady, который отправлялся бы в базовый ExoPlayer - person Ryan Burnham; 12.07.2017
comment
Хорошо, мне пришлось копать, хотя источник SimpleExoPLayerView, но я думаю, что нашел работу. Кажется, что кнопки воспроизведения используют mSimpleExoPlayerView.dispatchMediaKeyEvent (new KeyEvent (KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY)); который будет делегировать controlDispatcher.setPlayWhenReady - person Ryan Burnham; 12.07.2017

в XML

           <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/mainlayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/bgFrag">

            <com.google.android.exoplayer2.ui.PlayerView
                android:id="@+id/playerview"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:visibility="visible"
                app:use_controller="true"
                app:controller_layout_id="@layout/item_player_controler"
                app:keep_content_on_player_reset="true"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:resize_mode="zoom"
                app:shutter_background_color="@color/transperent">


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

            <ImageView
                android:id="@+id/ivExoPlayPause"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerInside"
                android:visibility="invisible"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:srcCompat="@drawable/ic_play" />
</<androidx.constraintlayout.widget.ConstraintLayout>

item_player_controler.xml

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

    <ImageView android:id="@id/exo_play"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:button="@null"
        android:scaleType="centerInside"
       />

    <ImageView android:id="@id/exo_pause"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:visibility="visible"
        android:button="@null"
        android:scaleType="centerInside"
        />

</FrameLayout>

в Java

videoviewholder.playerview.findViewById(R.id.exo_play).setOnClickListener(view->{
                    ToastUtils.showShort("play");
                    videoviewholder.videoItemBinding.ivExoPlayPause.setVisibility(View.INVISIBLE);
                    videoviewholder.videoItemBinding.playerview.getPlayer().setPlayWhenReady(true);
    
                });

   videoviewholder.playerview.findViewById(R.id.exo_pause).setOnClickListener(view->{
                    ToastUtils.showShort("pause");
                    videoviewholder.videoItemBinding.ivExoPlayPause.setVisibility(View.VISIBLE);
                    videoviewholder.videoItemBinding.playerview.getPlayer().setPlayWhenReady(false);
    
                });
    
                videoviewholder.playerview.setControllerAutoShow(true);
                videoviewholder.playerview.setControllerShowTimeoutMs(0);
                videoviewholder.playerview.setControllerHideOnTouch(false);
                videoviewholder.playerview.setPlayer(player);
person Manthan Patel    schedule 19.11.2020