Вот мои действия:
Код: Выделить всё
class PreviewActivity : BaseActivity() {
override fun getViewBinding(): ActivityPreviewBinding =
ActivityPreviewBinding.inflate(layoutInflater)
override fun getViewModelClass(): Class =
ActivityPreviewViewModel::class.java
@OptIn(UnstableApi::class)
override fun setupListener() {
binding.apply {
vv.player?.addListener(object : Player.Listener {
override fun onIsPlayingChanged(isPlaying: Boolean) {
Log.d(TAG, "[onIsPlayingChanged] IsPlaying: $isPlaying")
if (!isPlaying) {
vv.player?.play()
}
}
override fun onPlayerError(error: PlaybackException) {
super.onPlayerError(error)
Log.e(TAG, "[onPlayerError] Error: ${error.message}", error)
}
override fun onPlaybackStateChanged(playbackState: Int) {
super.onPlaybackStateChanged(playbackState)
Log.d(TAG, "[onPlaybackStateChanged] PlaybackState: $playbackState")
}
})
}
}
override fun setupViews() {
val bundle = intent.extras
val videoPath = bundle?.getString(BUNDLE_VIDEO_PATH)
setupVideo(videoPath)
}
@OptIn(UnstableApi::class)
private fun setupVideo(videoPath: String?) {
try {
binding.vv.apply {
val uri = Uri.parse(videoPath)
val mediaItem = MediaItem.fromUri(uri)
val exoPlayer = ExoPlayer.Builder(this@PreviewActivity).build()
exoPlayer.repeatMode = ExoPlayer.REPEAT_MODE_ONE
exoPlayer.playWhenReady = true
exoPlayer.addMediaItem(mediaItem)
exoPlayer.prepare()
exoPlayer.addAnalyticsListener(EventLogger())
useController = false
resizeMode = RESIZE_MODE_ZOOM
player = exoPlayer
}
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun onDestroy() {
super.onDestroy()
binding.vv.player?.clearMediaItems()
binding.vv.player?.clearVideoSurface()
binding.vv.player?.release()
}
companion object {
const val BUNDLE_VIDEO_PATH = "videoPath"
private const val ONE_SECOND = 1000L
private const val TAG = "PreviewActivity"
}
}
Когда я пытался записать состояния проигрывателя, я понял, что при воспроизведении видео воспроизведениеState изменяется на 3, что соответствует STATE_READY и isPlaying == true . Но если экран черный, playState изменяется на 2, что соответствует STATE_BUFFERING после STATE_READY и isPlaying == false без каких-либо исключений.
Код: Выделить всё
2024-10-11 15:46:30.799 PreviewActivity D [onPlaybackStateChanged] PlaybackState: 3
2024-10-11 15:46:30.800 PreviewActivity D [onIsPlayingChanged] IsPlaying: true
2024-10-11 15:46:30.817 ViewRootIm...wActivity] I MSG_WINDOW_FOCUS_CHANGED 1 1
2024-10-11 15:46:35.707 PreviewActivity D [onPlaybackStateChanged] PlaybackState: 2
2024-10-11 15:46:35.708 PreviewActivity D [onIsPlayingChanged] IsPlaying: false
Подробнее здесь: https://stackoverflow.com/questions/790 ... ack-screen
Мобильная версия