Audio control - Jetpack Compose
In Jetpack Compose, you should always be able to control audio. When using MediaPlayer
, you should implement buttons to call the start
, pause
and stop
methods.
It is a best practice to play audio through the correct channel. Android has introduced AudioAttributes
as a replacement of the STREAM
types defined in AudioManager
.
AudioAttributes
defines the following content types:
CONTENT_TYPE_MOVIE
: used for soundtracks, typically in moviesCONTENT_TYPE_MUSIC
: used for musicCONTENT_TYPE_SONIFICATION
: used for accompanying sounds, such as beepsCONTENT_TYPE_SPEECH
: used for speechCONTENT_TYPE_UNKNOWN
: used when the content type is unknown, or other than the available options
AudioAttributes
defines the following usages:
USAGE_ALARM
: used for alarmsUSAGE_ASSISTANCE_ACCESSIBILITY
: used for accessibility, e.g. for screen reader usersUSAGE_ASSISTANCE_NAVIGATION_GUIDANCE
: used for navigation directions, e.g. while drivingUSAGE_ASSISTANCE_SONIFICATION
: used for user interface soundsUSAGE_ASSISTANT
: used for user queries, audio instructions or help utterances.USAGE_GAME
: used for audio inside gamesUSAGE_MEDIA
: used for audio in media, such as moviesUSAGE_NOTIFICATION
: used for notification soundsUSAGE_NOTIFICATION_EVENT
: used to attract the user's attention, such as a reminder or low battery warning.USAGE_NOTIFICATION_RINGTONE
: used for telephony ringtonesUSAGE_UNKNOWN
: used when the usage is unknown, or not definedUSAGE_VOICE_COMMUNICATION
: used for voice communication, such as telephony or VoIPUSAGE_VOICE_COMMUNICATION_SIGNALLING
: used for in-call signalling, such as with a "busy" beep, orDTMF
tones.
// Set audio attributes
val player = remember {
MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.setLegacyStreamType(AudioManager.STREAM_ACCESSIBILITY)
.build()
)
}
}
// Provide media controls
Button(
onClick = {
if (player.isPlaying) {
player.pause()
} else {
player.start()
}
}
) {
// Button content...
}