Resumable playback for Android
Resumable playback for Android
FastPix Android SDK lets you resume video playback from the last watched position by saving progress and restoring it when the player is ready.
1. How it works
The activity imports FastPix Android SDK components, PlayerView for the video surface, FastPixPlayer for playback control, and PlaybackListener to observe player events like play, pause, seek, and completion.
2. Setting up the saved position
3. Restoring position on player ready
4. Tracking progress during playback
5. Saving progress on pause and stop
6. Cleaning up resources
1import android.os.Bundle
2import androidx.appcompat.app.AppCompatActivity
3import androidx.media3.common.PlaybackException
4import io.fastpix.media3.PlaybackListener
5import io.fastpix.media3.PlayerView
6import io.fastpix.media3.core.FastPixPlayer
7
8class ResumablePlaybackActivity : AppCompatActivity() {
9
10 private lateinit var playerView: PlayerView
11 private lateinit var player: FastPixPlayer
12
13 private val playbackId = "YOUR_PLAYBACK_ID"
14 private val savedPositionMsFromBackend = 42_000L // Example only
15
16 private var pendingResumePositionMs: Long? = savedPositionMsFromBackend
17
18 private val playbackListener = object : PlaybackListener {
19
20 override fun onPlay() = Unit
21 override fun onPause() = saveCurrentProgress()
22 override fun onPlaybackStateChanged(isPlaying: Boolean) = Unit
23 override fun onError(error: PlaybackException) = Unit
24
25 override fun onPlayerReady(durationMs: Long) {
26 val resumePositionMs = pendingResumePositionMs ?: return
27 pendingResumePositionMs = null
28 player.seekTo(resumePositionMs.coerceAtMost(durationMs))
29 }
30
31 override fun onTimeUpdate(
32 currentPositionMs: Long,
33 durationMs: Long,
34 bufferedPositionMs: Long
35 ) {
36 sendProgressToBackend(currentPositionMs, durationMs)
37 }
38
39 override fun onCompleted() = clearSavedProgress()
40 }
41
42 override fun onCreate(savedInstanceState: Bundle?) {
43 super.onCreate(savedInstanceState)
44 playerView = PlayerView(this).apply {
45 retainPlayerOnConfigChange = true
46 }
47 setContentView(playerView)
48
49 player = FastPixPlayer.Builder(this)
50 .setAutoplay(true)
51 .build()
52
53 playerView.player = player
54 player.addPlaybackListener(playbackListener)
55
56 player.setFastPixMediaItem {
57 this.playbackId = this@ResumablePlaybackActivity.playbackId
58 }
59 }
60
61 override fun onStop() {
62 super.onStop()
63 saveCurrentProgress()
64 }
65
66 override fun onDestroy() {
67 player.removePlaybackListener(playbackListener)
68 if (isFinishing) {
69 saveCurrentProgress()
70 playerView.release()
71 }
72 super.onDestroy()
73 }
74
75 private fun saveCurrentProgress() {
76 val positionMs = player.getCurrentPosition()
77 val durationMs = player.getDuration()
78 sendProgressToBackend(positionMs, durationMs)
79 }
80
81 private fun sendProgressToBackend(positionMs: Long, durationMs: Long) {
82 // Save progress in your app / backend.
83 }
84
85 private fun clearSavedProgress() {
86 // Clear saved progress in your app / backend.
87 }
88}