Tôi đang phát triển ứng dụng phát trực tuyến âm thanh cho Android và tích hợp Android Auto. Tôi đã làm theo hai hướng dẫn này.Ứng dụng Android Auto không bao giờ gọi trênGetRoot
Sử dụng Head Unit Desktop, tôi có thể chọn ứng dụng phương tiện truyền thông của tôi từ danh sách ứng dụng phương tiện truyền thông, nhưng từ đó một ProgressBar
vẫn thay vì nhường chỗ cho các "Để chơi một cái gì đó, mở menu ở trên cùng bên trái. " thông báo được thấy trong số Universal Music Player.
Khi kiểm tra, có vẻ như's onGetRoot()
không bao giờ được gọi và do đó không bao giờ điền MediaItemCompat
vào danh sách ứng dụng Auto.
Tệp kê khai của tôi chứa thông tin sau.
<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
rất đơn giản, chỉ tuyên bố Media.
<?xml version="1.0" encoding="utf-8"?>
<automotiveApp>
<uses name="media"/>
</automotiveApp>
My MediaService
mở rộng MediaBrowserServiceCompat
. Trong số onCreate()
tôi tạo và đặt MediaSessionCompat
của mình.
@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);
}
Cuối cùng, hai phương pháp ghi đè từ MediaBrowserServiceCompat
, trong đó không bao giờ được gọi.
@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);
}
}
Theo như tôi có thể nói, đó là tất cả những gì cần thiết để có được một Android Auto bắt đầu, nhưng khi tôi mở ứng dụng trên thiết bị đầu máy tính để bàn của tôi, chỉ có một ProgressBar
chào tôi, và khi tôi mở ra ngăn kéo nav -screen, có một cái khác. Tôi đã không nghe nói về trạng thái đó trong bất kỳ tài liệu nào tôi đã đọc. Có điều gì tôi đã bỏ lỡ?
Cảm ơn bạn rất nhiều vì đã đăng giải pháp này.Tôi đã gỡ lỗi này trong nhiều giờ. –