음악앱 목록을 불러오고, 특정 음악앱을 선택했을 때 바로 음악을 재생하고 싶었다. 저런 제목으로 검색을 해봤는데, 확실한 것들이 안 보였는데 이미 누가 앱으로 만든게 있었다.
출처: 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
에 뭐를 넣는가에 따라 동작이 살짝 다르니 필요에 따라 적절히 바꿔주면 된다.