目的
ExoPlayer で動画を視聴中にオフライン等で再生が不能になった後、オンラインに復帰して再生可能な状態になったときに再生を自動で再開したい。
例
方法
Player.EventListener
の onPlayerStateChanged()
から返却された playbackState
が Player.STATE_IDLE
の場合や、onPlayerError()
などで再生の失敗を検知した場合に ExoPlayer
の prepare()
を実行しておきます。
サンプル
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
when (playbackState) {
Player.STATE_IDLE -> player?.prepare(mediaSource, false, false)
}
}
ExoPlayer.prepare()
の第2引数は boolean resetPosition
になっていますが、動画が生配信の場合は true
にしておくのが良いかと思います。
結果
機内モードを解除した直後に動画の再生が再開されました
何故できるのか
prepare()
を実施すると player
の playbackState
が Player.STATE_BUFFERING
に変わり、一定時間経過しても再生準備ができない場合は playbackState
が Player.STATE_IDLE
に変わるため更に prepare()
が呼ばれる。
つまり再生の準備に成功するまで一定間隔でリトライを繰り返す無限ループに陥るからである。
そんな仕組みで大丈夫なのでしょうか(?)
参考
Android ExoPlayer not resuming after network is connected - Stack Overflow