This SDK enables seamless integration with Android Media Player, offering advanced video analytics via the FastPix Dashboard. It's a wrapper built on FastPix’s core Java library to deliver performance monitoring for video applications using Google's Android Media Player.
- User engagement tracking – Track key user actions such as play, pause, seek, and video completion to measure engagement.
- Playback quality analytics – Evaluate buffering, resolution changes, and network issues.
- No Dependency – Easily integrate FastPix SDK with Android’s native MediaPlayer without external dependencies.
- Device & app diagnostics – Gain insights into playback issues across devices.
- Error logging – Automatically capture fatal and handled playback errors.
- Android Studio Arctic Fox or newer
- Android SDK version 21+
- GitHub Personal Access Token (PAT) for private Maven access
repositories {
    maven {
        url = uri("https://maven.pkg.github.com/FastPix/android-media-player-data")
        credentials {
            username = "<your-github-username>"
            password = "<your-personal-access-token>"
        }
    }
}dependencies {
    implementation 'io.fastpix.data:mediaplayer:1.0.0'
}Ensure Media Player is initialized properly:
import android.media.MediaPlayer
import io.fastpix.data.entity.*
import io.fastpix.data.exo.FastPixBaseMediaPlayer
import io.fastpix.data.request.CustomOptions
class VideoPlayerActivity : AppCompatActivity() {
    private val mediaPlayer: MediaPlayer? = null
    private lateinit var fastPixBaseMediaPlayer: FastPixBaseMediaPlayer
    private val surfaceView: SurfaceView? = null
    private val mediaController: android.widget.MediaController? = null
    private val videoUrl = "https://demo.com/mp4"
    private var videotitel = "Titel"
    private var videoid = "123"
    override fun onCreate(savedInstanceState: Bundle?) {
        setContentView(R.layout.activity_video_player)
        // setContentView(R.layout.your_layout) // don't forget this if needed 
        surfaceView = findViewById(R.id.surfaceView)
        val holder = surfaceView?.getHolder()
        surfaceView?.setOnTouchListener(OnTouchListener { v, event ->
            // handle the player options hide and show	 
        })
        holder?.addCallback(object : SurfaceHolder.Callback {
            override fun surfaceCreated(holder: SurfaceHolder) {
                try {
                    // Setup media player	 
                    mediaPlayer = MediaPlayer()
                    mediaPlayer!!.setScreenOnWhilePlaying(true)
                    mediaPlayer!!.setDataSource(videoUrl)
                    mediaPlayer!!.setDisplay(holder)
                    val customerPlayerDataEntity = CustomerPlayerDataEntity()
                    val customerVideoDataEntity = CustomerVideoDataEntity()
                    val customerViewDataEntity = CustomerViewDataEntity()
                    try { // //Get it from dashboard  Get it from dashboard  
                        customerPlayerDataEntity.workspaceKey = "123"
                        customerVideoDataEntity.videoSourceUrl = "videoUrl"
                        
                        customerViewDataEntity.viewSessionId = UUID.randomUUID().toString()
                        val customerDataEntity = CustomerDataEntity(
                            customerPlayerDataEntity,
                            customerVideoDataEntity,
                            customerViewDataEntity
                        )
                        val customOptions = CustomOptions()
                        val customDataFp = CustomDataEntity()
                        customDataFp.customData1 = "cd1"
                        customDataFp.customData2 = "cd2"
                                
                        customDataFp.customData10 = "cd10"
                        customerDataEntity.customData = customDataFp
                    } catch (e: JSONException) {
                        throw RuntimeException(e)
                    }
                    fastPixBaseMediaPlayer!!.setPlayerView(surfaceView)
                    mediaPlayer!!.prepareAsync()
                }
                catch (e: IOException){
                    e.printStackTrace()
                }
            }
            override fun surfaceDestroyed(holder: SurfaceHolder) {
                if (mediaPlayer != null) {
                    // destroy the media player 
                }
            }
        })
    }
}<SurfaceView
    android:id="@+id/surfaceView"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:layout_alignParentTop="true" />Call fastPixBaseMediaPlayer.videoChange(CustomerVideoData) when switching videos to reset analytics context:
val newVideoData = CustomerVideoDataEntity().apply {
    videoId = "newId"
    videoTitle = "New Video"
    videoSourceUrl = "newUrl"
}
fastPixBaseMediaPlayer.videoChange(newVideoData)To manually report handled errors:
fastPixBaseMediaPlayer.error(FastPixErrorException("Custom playback error"))Disable automatic error tracking if needed:
fastPixBaseMediaPlayer.setAutomaticErrorTracking(false)For advanced usage and APIs, refer to the FastPix Developer Docs.