Building an audio app - Media session callbacks Android


Media session callbacks

https://developer.android.com/guide/topics/media-apps/audio-app/mediasession-callbacks

미디어 세션 콜백은 플레이어를 컨트롤하고 오디오 포커스를 관리하고 미디어 세션과 미디어 브라우져 서비스와 교신하기 위한 몇몇 API에서 메소드를 호출한다. 다음 테이블은 어떻게 이들 작업이 콜백사이에서 분포되는지 정리한다.


onPlay()onPause()onStop()
Audio FocusrequestFocus() passing in your OnAudioFocusChangeListener.
Always call requestFocus() first, proceed only if focus is granted.
abandonAudioFocus()
ServicestartService()stopSelf()
Media SessionsetActive(true) 
- Update metadata and state
- Update metadata and statesetActive(false) 
- Update metadata and state
Player ImplementationStart the playerPause the playerStop the player
Becoming NoisyRegister your BroadcastReceiverUnregister your BroadcastReceiver
NotificationsstartForeground(notification)stopForeground(false)stopForeground(false)

다음은 이 콜백을 위한 샘플 프레임워크를 보여준다.

private val intentFilter = IntentFilter(ACTION_AUDIO_BECOMING_NOISY)

private lateinit var afChangeListener: AudioManager.OnAudioFocusChangeListener
private val myNoisyAudioStreamReceiver = BecomingNoisyReceiver()
private lateinit var myPlayerNotification: MediaStyleNotification
private lateinit var mediaSession: MediaSessionCompat
private lateinit var service: MediaBrowserService
private lateinit var player: SomeKindOfPlayer

private lateinit var audioFocusRequest: AudioFocusRequest

private val callback = object: MediaSessionCompat.Callback() {
  override fun onPlay() {
    val am = mContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
    // 플레이백을 위한 오디오 포커스를 요청하고 afChangeListener 를 등록한다.
    audioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN).run {
      setOnAudioFocusChangeListener(afChangeListener)
      setAudioAttributes(AudioAttributes.Builder().run {
        setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        build()
      })
      build()
    }
    val result = am.requestAudioFocus(audioFocusRequest)
    if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
      // 서비스 시작
      startService(Intent(mContext, MediaBrowserService::class.java))
      // 세션 액티브를 설정 (메타데이터와 상태를 업데이트)
      mediaSession.isActive = true
      // 플레이어 시작 (커스텀 호출)
      player.start()
      // BECOME_NOISY BroadcastReceiver 를 등록한다
      registerReceiver(myNoisyAudioStreamReceiver, intentFilter)
      // 포어그라운드에 서비스를 두고 노티를 포스트한다
      service.startForeground(id, myPlayerNotification)
    }
  }
}

public override fun onStop() {
  val am = mContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
  // 오디오 포커스를 제거
  am.abandonAudioFocusRequest(audioFocusRequest)
  unregisterReceiver(myNoisyAudioStreamReceiver)
  // 서비스 종료
  service.stopSelf()
  // 세션 비활성 (그리고 메타데이터와 상태를 업데이트)
  mediaSession.isActive = false
  // 플레이어 종료 (커스텀 호출)
  player.stop()
  // 포어그라운드에서 서비스를 놔준다
  service.stopForeground(false)
}

public override fun onPause() {
  val am = mContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
  // 메타데이터와 상태를 업데이트
  // 플레이어를 일시정지 (커스텀 호출)
  player.pause()
  // BECOME_NOISY BroadcastReceiver 를 등록제거한다
  unregisterReceiver(myNoisyAudioStreamReceiver)
  // 포어그라운드에서 서비스를 놔줌, 노티피케이션 유지
  service.stopForeground(false)
}

Note: People using the Google Assistant can control your app with voice commands if you create your MediaSession with the necessary callbacks. The requirements are explained in the Google Assistant documentation.







덧글

댓글 입력 영역