rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

ExoPlayer2 イベントリスナの定義、リスナ登録、リスナ削除。android開発

2020 Jul. 19.


出典元 https://gumiossan.hatenablog.com/entry/2020/03/06/002802

イベントリスナ定義 コールバックメソッドを実装したイベントリスナインターフェースの無名オブジェクトを変数VALにセットする
リスナ登録 ExoPlayerインスタンス生成時に、変数を引数にしてaddListener(VAL)を実行する
リスナ削除 変数を引数にしてremoveListener(VAL)を実行する

    // Player.EventListener is public static interface
    // about Player.EventListener ->
    //   https://exoplayer.dev/listening-to-player-events.html
    //   https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/Player.html
    //   https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/Player.EventListener.html
    //   https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/package-summary.html
    // ExoPlayer2 is version 2 of ExoPlayer.
    //     Exoplayer version 1 is old.

    val TAG="MyLog"
    private var mySimpleExoPlayer: SimpleExoPlayer? = null
    private var myPlayWhenReady: Boolean = false
    private var playbackPosition = 0L
    private var currentWindow = 0
    private lateinit var playerView: PlayerView


    // in onCreate()
    playerView = video_view  // video_view is PlayerView in layout


    // イベントリスナの定義
    private val playerEventListener = object : Player.EventListener {
        override fun onIsPlayingChanged(isPlaying: Boolean) {
            val state = if (isPlaying) "STATE_PLAYING" else "STATE_NOT_PLAYING"
            Log.d(TAG, "isPlayingChanged: $state")
        }

        override fun onPlayerError(error: ExoPlaybackException) {
            Log.d(TAG, "Error: ${error.message ?: ""}")
        }

        override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
            val stateStr = when(playbackState) {
                SimpleExoPlayer.STATE_IDLE -> "STATE_IDLE"
                SimpleExoPlayer.STATE_BUFFERING -> "STATE_BUFFERING"
                SimpleExoPlayer.STATE_READY -> "STATE_READY"
                SimpleExoPlayer.STATE_ENDED ->  "STATE_ENDED"
                else -> "UNKNOWN"
            }
            Log.d(TAG, "state is ${stateStr}")
        }
    }


    // リスナ登録
    private fun initPlayer() {
        val mediaSource = buildMediaSource()
        val trackSelector = DefaultTrackSelector(this).apply {
            setParameters(buildUponParameters().setMaxVideoSizeSd())
        }
        mySimpleExoPlayer = SimpleExoPlayer.Builder(this)
            .setTrackSelector(trackSelector)
            .build()
            .apply {
                setPlayWhenReady(myPlayWhenReady)
                seekTo(currentWindow, playbackPosition)
                addListener(playerEventListener)
                prepare(mediaSource, false, false)
            }
        playerView.player = mySimpleExoPlayer
    }


    // リスナ削除
    private fun releasePlayer() {
        mySimpleExoPlayer?.let {
            myPlayWhenReady = it.playWhenReady
            playbackPosition = it.currentPosition
            currentWindow = it.currentWindowIndex
            it.removeListener(playerEventListener)
            it.release()
            mySimpleExoPlayer = null
        }


    private fun buildMediaSource(): MediaSource {
        val dataSourceFactory = DefaultDataSourceFactory(this, "exoplayer-sample-app")

        /*
        // dash media
        val uri = Uri.parse(getString(R.string.media_url_dash))
        return DashMediaSource.Factory(dataSourceFactory).createMediaSource(uri)
        */

        // mp4 media
        val uri = Uri.parse(getString(R.string.media_url_mp4))
        return ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(uri)
    }
}