Я использую Exoplayer в своем диалоге. Я хочу, чтобы видео воспроизводилось автоматически при открытии диалогового окна. Когда
simpleExoPlayer.prepare()
фрагмент активен, я могу запустить автовоспроизведение, но когда я закрываю диалоговое окно, звук продолжает воспроизводиться. Перед активацией simpleExoPlayer.prepare()
звук останавливается, когда я закрываю диалог. Есть ли другой способ автоматического воспроизведения exoplayer или остановки звука при закрытии диалога?
class VideoViewDialog (context: Context) : BaseDialog<LayoutDialogVideoViewBinding>(context) {
private var videoUrl : String = ""
private lateinit var simpleExoPlayer: ExoPlayer
override fun populateUi() {
setCanceledOnTouchOutside(true)
mBinding?.apply {
initializePlayer()
}
}
private fun initializePlayer() {
val mediaDataSourceFactory: DataSource.Factory = DefaultDataSource.Factory(context)
val mediaSource = ProgressiveMediaSource.Factory(mediaDataSourceFactory).createMediaSource(
MediaItem.fromUri(videoUrl))
val mediaSourceFactory: MediaSource.Factory = DefaultMediaSourceFactory(mediaDataSourceFactory)
simpleExoPlayer = ExoPlayer.Builder(context)
.setMediaSourceFactory(mediaSourceFactory)
.build()
simpleExoPlayer.addMediaSource(mediaSource)
simpleExoPlayer.playWhenReady = true
simpleExoPlayer.prepare()
mBinding?.apply {
playerView.player = simpleExoPlayer
playerView.requestFocus()
}
simpleExoPlayer.play()
}
private fun releasePlayer() {
simpleExoPlayer.release()
}
public override fun onStart() {
super.onStart()
if (Util.SDK_INT > 23) initializePlayer()
}
public override fun onStop() {
super.onStop()
if (Util.SDK_INT > 23) releasePlayer()
}
override fun getLayoutRes(): Int {
return R.layout.layout_dialog_video_view
}
companion object{
fun newInstance(
context: Context,
videoUrl : String,
) : VideoViewDialog{
val dialog = VideoViewDialog(context)
dialog.also {
it.videoUrl = videoUrl
}
return dialog
}
}
}
Пробовал .stop
, clearVideoSurface()
, playerView.player = null
до .release()
. Не работает
@emandt, выпускающий exoplayer на onDismiss(), также не работает
Вы проверяли, выполняется ли "onDismiss()" во время выполнения? Вы пытались вызвать ".stop()" перед ".release()"?
@emandt onDismiss() выполняется. Я пробовал ".stop", "clearVideoSurface()", "playerView.player = null" перед ".release()". Не работает
Кажется, вы дважды звонили initializePlayer()
. в результате воспроизводятся два экземпляра Exoplayer; вы можете освободить только тот, на который ссылается переменная simpleExoPlayer
.
Я объявил simpleExoPlayer
как глобальную переменную lateinit и инициализировал ее в функции initializePlayer()
. Эта функция работает под populateUi()
. Похоже, simpleExoPlayer
инициализировался под populateUi()
только один раз.
похоже, вы также вызвали это в onStart (), изменение переменной не означает ее уничтожение. ExoPlayer поддерживает себя с помощью ApplicationContext, поэтому он будет оставаться активным до тех пор, пока приложение не умрет или ресурс, который включает ссылку на контекст, не будет освобожден путем вызова release()
BaseDialog поддерживает переопределение события onDismiss(), если разработчик хочет что-то сделать, когда диалоговое окно закрыто.