When?
After Google’s official announcements at Android Dev Summit 2021
Jetpack Media 3 has come to play. With the official rollout of Jetpack Media3(v1.0) on 23 March 2023
What is Media 3?
Jetpack Media 3 is a set of libraries that help work with media files on Android devices. Earlier, there were two separate libraries, Media 2 and ExoPlayer 2, which had similar and different capabilities, making it hard to decide which one to use for different situations.
But now, AndroidX Media is a library that provides a unified way to work with media files. This makes it easier for developers to handle media files on Android devices. Some of the new features in AndroidX Media include:
Before we get deep into media3 deep we need to know some of the key components of Media3 :
Media app components
Player
: An interface that defines traditional high-level functionality for an audio or video player, such as playback controls.ExoPlayer
: The default implementation of thePlayer
interface in Media3.MediaSession
: An API that advertises media playback to and receives playback command requests from external clients.MediaSessionService
: A service that holds aMediaSession
to enable background playback.MediaLibraryService
: A service that additionally allows you to expose a content library to external clients.MediaController
: An API that is generally used by external clients to retrieve playback information and send playback command requests to your media app. Complementary to aMediaSession
. Examples of external clients include the notification and lock screen media controls on mobile and large screen devices, Android Auto, WearOS, and Google Assistant.MediaBrowser
: An API that additionally enables external clients to navigate your media app’s content library. Complementary to aMediaLibraryService
.
Originally published by Nevin Mital on the Android Developer Blog.
What’s new in Media 3?
A unified media API: AndroidX Media introduces a new unified media API that makes it easier for developers to work with media files. The new API provides a consistent way to access and manipulate media files across different types of media sources, such as local files, network streams, and content providers.
Media session management: AndroidX Media provides built-in support for media session management, which allows developers to create media sessions and control media playback using standard system controls such as the notification and lock screen.
- Problem: With Media 2 & Exoplayer, there was a need to add a separate connector since the media controller & session were not directly compatible with Exoplayer
- Solution: With Media3 all the components such as Media Session, and Media Controller are based on the same common player interface which makes them compatible with each other & removes the usage of the connector between Media player & Media Session/Controller
#AndroidDevSummit
Media Library service: AndroidX Media provides a media browser service that allows developers to browse and play media content from different sources, such as media providers and apps.
With Media 3 in Play, we can easily
- Define your own Custom Player
- Have better control over your Media Session & expose it to other controllers
- Expose Media Content & Integration support with other apps
Basic Demo Implementation
ExoPlayer-Demo at media3/feat_setup_exoplayer
The implementation of Jetpack Media3 is quite similar to legacy Exoplayer 2 i.e. what we used to work on earlier.
Libraries :
def media3_version = "1.0.1" implementation "androidx.media3:media3-exoplayer:$media3_version" implementation "androidx.media3:media3-ui:$media3_version" implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
The Basic implementation for Media3 is similar to What we had in ExoPlayer
val mediaItem = MediaItem.fromUri(VIDEO_URL) | |
val mediaSource = | |
HlsMediaSource.Factory(cacheDataSourceFactory).createMediaSource(mediaItem) | |
player.setMediaSource(mediaSource) |
Migration from ExoPlayer to Media3 Player
- A migration guide to walk you through the process step-by-step
- A migration script to convert your standalone ExoPlayer project packages to the corresponding new modules and packages under Media3
Media Session Demo Implementation
ExoPlayer-Demo at media3/feat_media3_session
Libraries :
def media3_version = "1.0.1" implementation "androidx.media3:media3-exoplayer:$media3_version" implementation "androidx.media3:media3-ui:$media3_version" implementation "androidx.media3:media3-exoplayer-hls:$media3_version" implementation "androidx.media3:media3-session:$media3_version" implementation "androidx.media3:media3-common:$media3_version"
Setup Media Playback Service
The Player
interface plays a key role in the architecture of Media3.
Step 1 : Setup Media Controller
- In the Player-Activity set the MediaController this controller acts as the bridge between Media Player & its Session
- Post setting up the media controller we can use the same controller to play the media item
val sessionToken = SessionToken(this, ComponentName(this, MediaPlaybackService::class.java)) val controllerFuture = MediaController.Builder(this,sessionToken).buildAsync() controllerFuture.addListener({ val controller = controllerFuture.get() controller.setMediaItem(mediaItem) controller.prepare() controller.play() }, MoreExecutors.directExecutor())
Step 2 : Setup Media Playback Service
- Media Playback Service is a
MediaLibraryService
that allows us to maintain & play any media item in the background
// Extend MediaSessionService class MediaPlaybackService : MediaSessionService() { private var mediaSession: MediaSession? = null // Create your Player and MediaSession in the onCreate lifecycle event override fun onCreate() { super.onCreate() val player = ExoPlayer.Builder(this).build() mediaSession = MediaSession.Builder(this, player).build() } // Return a MediaSession to link with the MediaController that is making // this request. override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaSession? = mediaSession }
- Make sure to register this service in Manifest & add the required foreground service permission if not added already
<service android:name=".MediaPlaybackService" android:foregroundServiceType="mediaPlayback" android:exported="true"> <intent-filter> <action android:name="androidx.media3.session.MediaSessionService"/> </intent-filter> </service>
With the introduction of Jetpack Media 3 all the functionality that Exoplayer used to support are already part of media 3 library bundle
Demo Video
Job Offers
Some Additional thoughts?
With the introduction of Jetpack Media 3 there will be lot of more things coming to picture that combines & eases all the existing use case that involve usage of Media Players .
Thank you for reading, stay tuned for amazing articles!
Catch me up at: https://twitter.com/its_pra_tick
Do not forget to give claps !! Happy Coding 🙂
This article was previously published on proandroiddev.com