[android] get music app list and play music

음악앱 목록을 불러오고, 특정 음악앱을 선택했을 때 바로 음악을 재생하고 싶었다.   저런 제목으로 검색을 해봤는데, 확실한 것들이 안 보였는데 이미 누가 앱으로 만든게 있었다.

출처: https://github.com/harleensahni/media-button-router

// 음악앱 불러오기
private fun loadMusicAppList() {
  val mediaButtonIntent = Intent(Intent.ACTION_MEDIA_BUTTON)
  val list = packageManager.queryBroadcastReceivers(mediaButtonIntent, PackageManager.GET_RESOLVED_FILTER)

  list.forEach {
    Log.i("APP#", it.activityInfo.packageName + "|" + it.loadLabel(packageManager))
  }
}

이렇게하면 음악앱들을 가져올 수 있다. 근데 꼭 음악앱이라고 생각되는 앱만 나오는 건 아니고 크롬 같은 것도 나온다. 

/**
  * 앱 실행하고, 바로 음악 재생하기
  * @param packageName com.apple.android.music
  * @param name Apple Music
  */
private fun runAppThenPlay(packageName: String, name: String) {
  val selectedReceiver = ComponentName(packageName, name)
  val keyCode = KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE // play, pause, play_pause

  val mediaButtonDownIntent = Intent(Intent.ACTION_MEDIA_BUTTON)
  val downKe = KeyEvent(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), KeyEvent.ACTION_DOWN, keyCode, 0)
  mediaButtonDownIntent.putExtra(Intent.EXTRA_KEY_EVENT, downKe)

  val mediaButtonUpIntent = Intent(Intent.ACTION_MEDIA_BUTTON)
  val upKe = KeyEvent(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), KeyEvent.ACTION_UP, keyCode, 0)
  mediaButtonUpIntent.putExtra(Intent.EXTRA_KEY_EVENT, upKe)

  mediaButtonDownIntent.component = selectedReceiver
  mediaButtonUpIntent.component = selectedReceiver

  val launchIntent = packageManager.getLaunchIntentForPackage(packageName)
  launchIntent?.let { startActivity(launchIntent) }

  sendOrderedBroadcast(mediaButtonDownIntent, null, null, null, Activity.RESULT_OK, null, null)
  sendOrderedBroadcast(mediaButtonUpIntent, null, null, null, Activity.RESULT_OK, null, null)
}

특정 앱을 실행하면서 바로 음악을 재생하고 싶다면 이렇게 하면 된다. 파라미터는 목록 조회할 때 사용한 resolveInfo.activityInfo.packageName 과  resolveInfo.loadLabel(packageManager) 를 사용하면 편하다. 

keyCode 에 뭐를 넣는가에 따라 동작이 살짝 다르니 필요에 따라 적절히 바꿔주면 된다.