This repository demonstrates how to use ExoPlayer in a Jetpack Compose application. It includes three different player implementations:
- Online Player: Streams video from an online URL.
- Raw Player: Plays a video stored in the raw resources of the app.
- YouTube Player: Embeds a YouTube video using a
WebView
.
- Android Studio with Jetpack Compose setup
- ExoPlayer dependency in your
build.gradle
file - Internet permissions if using the Online Player
-
Clone the repository:
git clone https://github.com/Bhavyansh03-tech/Exo_Player.git
-
Open the project in Android Studio.
-
Build the project and run it on an emulator or a physical device.
![First Screenshot](https://private-user-images.githubusercontent.com/96388594/352721282-7b16e0de-536a-42d9-862b-342ba2fcd667.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMzkzNzYsIm5iZiI6MTczOTIzOTA3NiwicGF0aCI6Ii85NjM4ODU5NC8zNTI3MjEyODItN2IxNmUwZGUtNTM2YS00MmQ5LTg2MmItMzQyYmEyZmNkNjY3LmpwZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjExVDAxNTc1NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBhM2E2NGJiNWI5NzIzNDczM2RkZjUyOTJmZmZhNDVmNTA0NTlkMDdmYmQ5NzA4MjRjNDY3ZDVkYjUzNTFkNmMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.3to6hKToZh4dF9-SzjKPsdvsZXVl2EQcBcI-PdPGCpQ)
![Second Screenshot](https://private-user-images.githubusercontent.com/96388594/352721311-60666de7-e93a-4f88-934d-d4bb0d89e22e.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMzkzNzYsIm5iZiI6MTczOTIzOTA3NiwicGF0aCI6Ii85NjM4ODU5NC8zNTI3MjEzMTEtNjA2NjZkZTctZTkzYS00Zjg4LTkzNGQtZDRiYjBkODllMjJlLmpwZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjExVDAxNTc1NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM1NWQ1NThlZjA2MDI2NjhjZDNmNTg0YTI3NGMwNjI2Y2JkOTFjMzc2YWJiZjE0YzA3YWMwZmNiNWJkMzkyNmYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.WFLs_6XCKU9n7w7xhjr-e17Ml-FNKEOMtWcaIIiRh1g)
![Third Screenshot](https://private-user-images.githubusercontent.com/96388594/352721333-cd82e250-c62f-4335-965f-cf3e48ab2b0e.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMzkzNzYsIm5iZiI6MTczOTIzOTA3NiwicGF0aCI6Ii85NjM4ODU5NC8zNTI3MjEzMzMtY2Q4MmUyNTAtYzYyZi00MzM1LTk2NWYtY2YzZTQ4YWIyYjBlLmpwZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjExVDAxNTc1NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWYxNTk2Y2M1OWVhMzQ5ZGI5NzJkOTkwZDdhZTU3YzI4MDkyNmQzYmUwYzU1ZjQwYTU4MGZmNGMyYTM0YjkxMWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.6Bc7v0MyzK-uj9s-_3V43a5RRr3VJ7pXaTsDzX8mAmI)
-
Add Dependencies
Make sure you have the following dependencies in your
build.gradle
file:[libraries] # YOUTUBE PLAYER :-> androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } # MEDIA EXO PLAYER :-> androidx-media3-exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3Exoplayer" } androidx-media3-exoplayer-hls = { module = "androidx.media3:media3-exoplayer-hls", version.ref = "media3Exoplayer" } androidx-media3-ui = { module = "androidx.media3:media3-ui", version.ref = "media3Exoplayer" }
-
Add Internet Permission (for Online Player)
In your
AndroidManifest.xml
, add the following permission:<uses-permission android:name="android.permission.INTERNET"/>
Streams video from an online URL.
// Media Item :->
val mediaItem = MediaItem.fromUri("https://cdn.pixabay.com/video/2024/04/18/208442_large.mp4") // Apply Changes.
// Media source :->
val mediaSource: MediaSource = ProgressiveMediaSource.Factory(DefaultHttpDataSource.Factory()) // Add this.
.createMediaSource(mediaItem)
val exoPlayer = remember {
ExoPlayer.Builder(context).build().apply {
setMediaSource(mediaSource) // Apply Changes.
prepare()
playWhenReady = true
}
}
Plays a video stored in the raw resources of the app.
@Composable
fun RawPlayer() {
// Lifecycle :->
var lifecycle by remember {
mutableStateOf(Lifecycle.Event.ON_CREATE)
}
// Get context :->
val context = LocalContext.current
// Media Item :->
val mediaItem = MediaItem.fromUri("android.resource://${context.packageName}/${R.raw.sample}")
// Media source :->
val exoPlayer = remember {
ExoPlayer.Builder(context).build().apply {
setMediaItem(mediaItem)
prepare()
playWhenReady = true
}
}
// Lifecycle for composable :->
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(key1 = lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
lifecycle = event
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose {
exoPlayer.release()
lifecycleOwner.lifecycle.removeObserver(observer)
}
}
// Android View :->
AndroidView(
modifier = Modifier
.fillMaxWidth()
.aspectRatio(16f / 9f),
factory = {
PlayerView(context).also { playerView ->
playerView.player = exoPlayer
}
},
update = {
when (lifecycle){
Lifecycle.Event.ON_RESUME -> {
it.onPause()
it.player?.pause()
}
Lifecycle.Event.ON_PAUSE -> {
it.onResume()
}
else -> Unit
}
}
)
}
Embeds a YouTube video using a WebView
.
@Composable
fun YoutubePlayer(videoId: String) {
AndroidView(
modifier = Modifier.fillMaxSize().padding(top = 25.dp),
factory = { context ->
WebView(context).apply {
webViewClient = WebViewClient()
settings.javaScriptEnabled = true
loadUrl("https://youtu.be/$videoId")
}
}
)
}
Contributions are welcome! Please fork the repository and submit a pull request for any improvements or bug fixes.
- Fork the repository.
- Create your feature branch (
git checkout -b feature/your-feature
). - Commit your changes (
git commit -am 'Add some feature'
). - Push to the branch (
git push origin feature/your-feature
). - Create a new Pull Request.
For questions or feedback, please contact @Bhavyansh03-tech on GitHub or connect with me on LinkedIn.