41

プレイリストの形でビデオを次々と再生しようとしています。Android Exoplayer を使用してファイルを再生していますが、メディア ファイルの最後をリッスンするリスナーが mediaplayer にありません。exoplayer を使用してメディア ファイルの最後を聞く方法はありますか。

4

11 に答える 11

37

Exoplayer は、メディア プレーヤーにはない事前実装を提供します。

Android による Exoplayerの事前の例では、 FullPlayerActivity.java で、 STATE_ENDEDを提供するonStateChangedを実装しています

このページの右側のセクションのRELATED SAMPLESという用語から例をダウンロードできます。

于 2014-12-08T05:35:08.313 に答える
12

あなたはこれを行うことができます:

playerExo.addListener(new ExoPlayer.Listener() {

            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {

                switch(playbackState) {
                    case ExoPlayer.STATE_BUFFERING:
                        break;
                    case ExoPlayer.STATE_ENDED:
                        //do what you want
                        break;
                    case ExoPlayer.STATE_IDLE:
                        break;
                    case ExoPlayer.STATE_PREPARING:
                        break;
                    case ExoPlayer.STATE_READY:
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onPlayWhenReadyCommitted() {

            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {

            }
        });
        playerExo.seekTo(0);
        playerExo.setPlayWhenReady(true);

しかし、@Murtaza Khursheed Hussainの答えは正しいです!素敵なコードの日を!他に何か必要な場合はお知らせください。

于 2017-06-20T13:30:20.600 に答える
11

インターフェースPlayer.EventListerを実装し、exoPlayerに追加する必要があります。

メソッドonPlayerStateChangedにコードを書くだけです。コードを参照してください。

exoPlayer.addListener( new Player.EventListener() {
            @Override
            public void onTimelineChanged(Timeline timeline, @Nullable Object manifest, int reason) {

            }

            @Override
            public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

            }

            @Override
            public void onLoadingChanged(boolean isLoading) {

            }

            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {

                switch(playbackState) {
                    case Player.STATE_BUFFERING:
                        break;
                    case Player.STATE_ENDED:
                        //Here you do what you want
                        break;
                    case Player.STATE_IDLE:
                        break;
                    case Player.STATE_READY:
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onRepeatModeChanged(int repeatMode) {

            }

            @Override
            public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {

            }

            @Override
            public void onPositionDiscontinuity(int reason) {

            }

            @Override
            public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

            }

            @Override
            public void onSeekProcessed() {

            }


        });
于 2018-08-31T12:20:03.687 に答える
1

exoplayer でプレイリストを使用していましたが、完了後にメディアを停止したいと考えていました。

私にとっては、プレイリストが内部で終了したときにPlayer.STATE_ENDEDが呼び出されていました

私のユースケースを満たすために、最初にこれをexoplayerに設定しました

 simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE);

したがって、EventListenerを使用する代わりに、 onPositionDiscontinuityを eventTime パラメータでオーバーライドするAnalyticsListenerを使用し、単純なコードを追加してメディアが再起動したかどうかを確認しました。

   @Override
   public void onPositionDiscontinuity(EventTime eventTime, int reason) {
        if (eventTime.currentPlaybackPositionMs / 1000 < 1) {
            exoPlayer.setPlayWhenReady(false);
            tvReplay.setVisibility(View.VISIBLE);
        }
    }

これがあなたのユースケースに役立つことを願っています

于 2019-07-15T07:15:09.947 に答える
1

DefaultEventListeneronPlayerStateChanged()は非推奨です。

使用Player.EventListenerしてonPlaybackStateChanged()

コトリンコード:

 player!!.addListener(object : Player.EventListener {
            override fun onPlaybackStateChanged(state: Int) {
                if (state == Player.STATE_ENDED) {
                    // your code here
                }
            }
        })
于 2021-05-25T04:37:25.043 に答える