Однако я хочу гарантировать, что если пользователь пропустит или перемотает видео с помощью SeekBar, они будут пропущены или повторены. разделы не учитываются в расчете процента прогресса. Я хочу, чтобы процент прогресса отражал время фактического воспроизведения видео, момент за моментом.
Кроме того, я хочу, чтобы каждая просматриваемая секунда засчитывалась только один раз в процент прогресса, поэтому, если пользователь пересматривает определенные разделы видео, эти повторяющиеся секунды больше не учитываются при расчете прогресса.
Мне также нужно сохранить этот процент прогресса, количество просмотренных секунд и соответствующие сведения о видео, чтобы при закрытии и повторном открытии приложения информация для каждого видео сохраняется. При повторном воспроизведении видео расчет прогресса должен продолжиться с того места, где он был остановлен, на основе ранее сохраненных данных.
Более того, я хочу, чтобы пользователь мог возобновить просмотр видео с того места, где он остановился, при повторном воспроизведении. вход в деятельность. Должно быть ясно, где пользователь последний раз смотрел видео перед завершением действия.
Пожалуйста, помогите мне реализовать эту функцию в моем коде. Кроме того, если мне понадобится добавить для этого какие-либо библиотеки, дайте мне знать.
Заранее благодарю за помощь.
Код: Выделить всё
class ViewWatchLessonsActivity(
private val context: Context
) {
val binding = ActivityWatchLessonsBinding.inflate(LayoutInflater.from(context))
private val handler = Handler(Looper.getMainLooper())
private val player = ExoPlayer.Builder(context).build()
private val textViewProgress = binding.txtProgressNumber
private val progressBar = binding.progressBar
private var videoDuration: Long = 0
private var totalPlaybackTime: Long = 0
private var isUserSeeking: Boolean = false
private var progress: Int = 0
private val visitedSeconds = mutableSetOf()
fun initVideoView(videoAddress: Int) {
binding.playerViewOfLessons.player = player
val mediaItem =
MediaItem.fromUri("android.resource://${context.packageName}/${videoAddress}")
player.setMediaItem(mediaItem)
player.prepare()
player.addListener(object : Player.Listener {
override fun onPlaybackStateChanged(state: Int) {
when (state) {
Player.STATE_READY -> {
videoDuration = player.duration
updateProgressBar()
}
Player.STATE_ENDED -> {
handler.removeCallbacksAndMessages(null)
}
}
}
@Deprecated("Deprecated in Java")
override fun onPositionDiscontinuity(reason: Int) {
if (reason == Player.DISCONTINUITY_REASON_SEEK) {
isUserSeeking = false
}
}
})
}
private fun updateProgressBar() {
handler.post(object : Runnable {
@SuppressLint("SetTextI18n")
override fun run() {
val currentPosition = player.currentPosition
if (!isUserSeeking) {
val currentSecond = (currentPosition / 1000).toInt()
if (!visitedSeconds.contains(currentSecond)) {
visitedSeconds.add(currentSecond)
totalPlaybackTime += 1000
}
progress = (totalPlaybackTime / videoDuration.toFloat() * 100).toInt()
textViewProgress.text = "$progress/100%"
progressBar.progress = progress
}
handler.postDelayed(this, 1000)
}
})
}
fun onPause() {
handler.removeCallbacksAndMessages(null)
player.pause()
}
fun onResume() {
updateProgressBar()
}
fun onDestroy() {
handler.removeCallbacksAndMessages(null)
player.release()
}
}
"Кстати, я тестировал этот метод как с SharedPreferences, так и с комнатой. базы данных, но в обоих методах я столкнулся с этой проблемой при сохранении."
Подробнее здесь: https://stackoverflow.com/questions/789 ... nd-save-it