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