AndroidAutoとは
AndroidAutoに対応したカーナビに接続することで、カーナビからアプリを操作することが可能になるというものです。
発生した問題
カーナビに接続した際、MediaBrowserが実装されているアプリは、AndroidAutoアプリから、おすすめ欄に表示されるコンテンツの取得が行われます。
(添付画像はSpotifyのおすすめ表示)

コンテンツの取得の動作として以下の手順で探索が行われます。
- rootのidがリクエストされる。
- 返却される
MediaBrowserCompat.MediaItem()へ-
FLAG_PLAYABLEが指定されている場合、そのコンテンツをおすすめに表示する。 -
FLAG_BROWSABLEが指定されている場合、そのidの以下にあるコンテンツを取得する。
-
- 2件取得されるまで探索する。
この時コンテンツの取得処理以外の処理が入っている場合、実行されてしまいます。
対応
onGetRootのclientPackageNameにAndroidAutoアプリのパッケージが入ってきたか判断することで、おすすめかどうか判断できるため、その場合はおすすめに表示したいFLAG_PLAYABLEなMediaItemのみ返却しましょう。
override fun onGetRoot(
clientPackageName: String,
clientUid: Int,
rootHints: Bundle?
): BrowserRoot {
val isRecommend = clientPackageName == "com.google.android.projection.gearhead"
val id = if (isRecommend) {
MediaLibrary.RECOMMEND_ID
} else {
MediaLibrary.ROOT_ID
}
return BrowserRoot(id, null)
}
override fun onLoadChildren(
parentId: String,
result: Result<List<MediaBrowserCompat.MediaItem>>
) {
val items = when (parentId) {
MediaLibrary.ROOT_ID -> MediaLibrary.rootItems()
MediaLibrary.RECOMMEND_ID -> MediaLibrary.recommendItems()
else -> MediaLibrary.childrenFor(parentId)
}
result.sendResult(items)
}