I am developing an audio streaming application for Android and integrating Android Auto. I follow these two textbooks.
Android Developer Training
Android PTR Blog
Using the Head Head Unit, I can select my media application from the list of media applications, but from there the ProgressBar remains instead of giving way to "To play something, open the menu in the upper left corner." post to Universal Music Player .
When checking, it seems that MediaBrowserServiceCompat onGetRoot() never called and thus never populates my MediaItemCompat in the auto-application list.
My manifest contains the following.
<manifest package="com.app.audio" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <application android:name="com.app.audio.AudioApp" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name="com.app.audio.presentation.home.HomeActivity" android:label="@string/app_name" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name="com.app.audio.presentation.weather.WeatherActivity" android:screenOrientation="userPortrait"/> <activity android:name="com.app.audio.presentation.settings.SettingsActivity"/> <activity android:name="com.app.audio.presentation.alarm.AlarmActivity"/> <activity android:name="com.app.audio.presentation.sleep.SleepActivity"/> <receiver android:name="com.app.audio.audio.AudioIntentReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON"/> <action android:name="android.media.AUDIO_BECOMING_NOISY"/> </intent-filter> </receiver> <receiver android:name="com.app.audio.presentation.alarm.AlarmReceiver"></receiver> <receiver android:name="com.app.audio.presentation.sleep.SleepReceiver"></receiver> <service android:name="com.app.audio.data.service.media.MediaService" android:exported="true"> <intent-filter> <action android:name="android.media.browse.MediaBrowserService"/> </intent-filter> </service> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> <meta-data android:name="com.google.android.gms.car.application" android:resource="@xml/automotive_app_desc"/> <meta-data android:name="com.google.android.gms.car.notification.SmallIcon" android:resource="@drawable/ic_launcher"/> </application>
My automotive_app_desc.xml very simple, just a Media ad.
<?xml version="1.0" encoding="utf-8"?> <automotiveApp> <uses name="media"/> </automotiveApp>
My MediaService extends MediaBrowserServiceCompat . In onCreate() I create and install my MediaSessionCompat .
@Override public void onCreate() { super.onCreate(); //... mediaSession = new MediaSessionCompat( this, SESSION_TAG, mediaIntentReceiver, null ); mediaSession.setFlags( MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); mediaSession.setCallback(new MediaSessionCompat.Callback() { @Override public void onPlay() { super.onPlay(); play(selectedStream); } @Override public void onPause() { super.onPause(); pause(); } @Override public void onStop() { super.onStop(); stop(); } @Override public void onSkipToNext() { super.onSkipToNext(); playNextStation(); } @Override public void onSkipToPrevious() { super.onSkipToPrevious(); playPreviousStation(); } }); mediaSession.setActive(true); setSessionToken(mediaSession.getSessionToken()); updatePlaybackState(ACTION_STOP); }
Finally, there are two overridden methods from MediaBrowserServiceCompat , from which it is never called.
@Nullable @Override public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid, @Nullable Bundle rootHints) { return new BrowserRoot(ROOT_ID, null); } @Override public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result) { List<MediaBrowserCompat.MediaItem> items = getMediaItemsById(parentId); if (items != null) { result.sendResult(items); } }
As far as I can tell, all that is required to run Android Auto, but when I open the application on my desktop, there is only a ProgressBar greeting, and when I open the nav drawer screen, there is another one. I have not heard of this condition in any material that I read. Did I miss something?