2016-07-26 9 views
6

Ich entwickle eine Audio-Streaming-Anwendung für Android und die Integration von Android Auto. Ich habe diese beiden Tutorials verfolgt.Android Auto App ruft nie aufGetRoot

Android Developer Training

PTR Android Blog

Verwenden des Desktop Head Unit, ich bin der Lage, meine Medien-App aus dem Medien App-Liste auswählen, aber von dort ein ProgressBar bleibt stattdessen Weg zum „des Gebens zu spielen etwas, öffne das Menü oben links. " Nachricht in der Universal Music Player gesehen.

Bei der Überprüfung scheint es, dass die MediaBrowserServiceCompatonGetRoot() nie aufgerufen wird und somit nie meine MediaItemCompat in die Auto-App-Liste auffüllt.

Mein Manifest enthält Folgendes.

<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> 

Meine automotive_app_desc.xml ist sehr einfach, nur zu erklären Medien.

<?xml version="1.0" encoding="utf-8"?> 
<automotiveApp> 
    <uses name="media"/> 
</automotiveApp> 

Mein MediaService erstreckt MediaBrowserServiceCompat. In der onCreate() erstelle und setze ich meine 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); 
} 

Schließlich sind die beiden überschriebenen Methoden aus MediaBrowserServiceCompat, von denen weder jemals genannt wird.

@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); 
    } 
} 

Soweit ich sagen kann, ist, dass alles, was ein Android Auto zu erhalten begonnen erforderlich, aber wenn ich die App auf meiner Desktop-Kopfeinheit zu öffnen, gibt es nur ein ProgressBar mir Gruß, und wenn öffne ich die weg -screen-nav-schublade, da ist noch eine. Ich habe von diesem Zustand in keinem Material gehört, das ich gelesen habe. Gibt es etwas, das ich vermisst habe?

Antwort

8

Letztendlich hatte das Problem nichts mit dem zu tun, was ich beschrieben habe. Die oben erwähnte MediaService macht auch andere Aufgaben, die eine benutzerdefinierte Binder erfordern. Diese benutzerdefinierte Binder rief nicht die onGetRoot() für die Haupteinheit benötigt. Als Lösung überprüfe ich die Intent Aktion und gebe super.onBind() zurück, wenn es von der MediaBrowserServiceCompat stammt.

@Override 
public IBinder onBind(Intent intent) { 
    if (SERVICE_INTERFACE.equals(intent.getAction())) { 
     return super.onBind(intent); 
    } 
    return new MediaBinder(); 
} 

Die SERVICE_INTERFACE ist eine Konstante in MediaBrowserServiceCompat.

+1

Vielen Dank für die Veröffentlichung dieser Lösung.Ich habe das seit Stunden getestet. –

0

Ich bin ein Android-Auto zu entwickeln, aber ich habe einige Probleme in diesem Teil meines Codes, in Onbind Methode des Dienstes:

public IBinder onBind(Intent arg0) { 
    Log.i("TAG", "OnBind"); 
    // TODO Auto-generated method stub 
    if (SERVICE_INTERFACE.equals(arg0.getAction())) { 
     Log.i("TAG", "SERVICE_INTERFACE"); 
     registerReceiver(receiver, filter); 
     return super.onBind(arg0); 
    } else { 
     Log.i("Musica Service", "musicBind"); 
     return musicBind;} 
} 

ich andere Aktivitäten haben gebunden mit meinem Service durch einen musicBind IBinder, aber Auf der anderen Seite habe ich alle Dinge eingestellt, um meine App in Android Auto-Schnittstelle zu verbinden, aber nach dem Schließen meiner App nach dem Trennen des Geräts von der Android-Auto kann ich nicht aufhören, meine mediabrowserservice compat. Ich denke, es ist aufgrund dieser SERVICE_INTERFACE hält den Service gebunden. Wie kann ich das stoppen oder zerstören von servicemediabrowserservicecompat?

+1

Willkommen bei Stack Overflow. Dies ist keine Antwort auf die Frage, es ist ein Kommentar/eine neue Frage. Sobald Sie ausreichenden Ruf (50) haben, können Sie jeden Beitrag kommentieren. In der Zwischenzeit können Sie Reputation [** Ihre eigenen Fragen zu bekommen **] (http://Stackoverflow.com/help/how-to-ask) oder [** Antworten auf Betreffs **] (http://stackoverflow.com/help/how-to-answer). – Vickel