Skip to content

Android quick start

OGPlayer for Android is built on Media3/ExoPlayer with a Jetpack Compose player UI, distributed as AAR artifacts.

Requirements: Android 8.0+ (minSdk 26) · Kotlin 2.1+ · a Compose-enabled app for the UI module (ogplayer-core alone works from any Android app).

dependencies {
implementation("tv.ogplayer:ogplayer-core:<version>")
implementation("tv.ogplayer:ogplayer-ui:<version>")
// optional capabilities:
implementation("tv.ogplayer:ogplayer-ads-ima:<version>")
implementation("tv.ogplayer:ogplayer-cast:<version>")
}
val player = OGPlayer.Builder(context)
.setLicenseKey("OGP1…") // omit → watermarked trial mode
.setAdsProvider(ImaAdsProvider(context)) // optional
.setCastConnector(OGCastConnector(context)) // optional
.build()
player.load(
OGMediaItem.Builder("https://example.com/stream.m3u8")
.setStreamType(StreamType.VOD)
.setTitle("My video")
.setDrm(
DrmConfig.Builder("https://license.example.com/widevine")
.setTokenProvider("X-AxDRM-Message") { tokenService.freshToken() }
.build(),
)
.setThumbnailTrack("https://example.com/storyboard.vtt")
.build(),
)

DRM tokens are fetched on every license request — never frozen at load time — so sessions survive long pauses and license expiry transparently (PlaybackListener.onDrmSessionRenewed).

OGPlayerView(
player = player,
uiConfig = OGUiConfig.Builder().build(),
fullscreenHandler = ActivityFullscreenHandler(activity),
overlays = mapOf(OverlaySlot.TOP_END to { MyWatermark() }),
)

Release the player with player.release() when the screen goes away.

player.addListener(object : PlaybackListener {
override fun onStateChanged(state: PlaybackState) { /* IDLE/BUFFERING/READY/ENDED */ }
override fun onError(error: OGPlayerError) { /* stable codes, see Error codes */ }
})
player.addAnalyticsListener { event -> analytics.track(event.toString()) }

Every guide in these docs has a matching screen in the open-source Android demo app — clone it and lift code from there.