2016-07-26 14 views
6

Zajmuję się tworzeniem aplikacji do strumieniowego przesyłania dźwięku na Androida i integracją Androida Auto. Śledziłem te dwa samouczki.Aplikacja Android Auto nigdy nie dzwoniGetRoot

Android Developer Training

PTR Android Blog

Korzystanie z pulpitu radioodtwarzaczy, jestem w stanie wybrać moją aplikację multimediów z listy aplikacji medialnej, ale stamtąd ProgressBar pozostaje zamiast ustępując „Do grać coś, otwórz menu w lewym górnym rogu. " wiadomość widziana w Universal Music Player.

Podczas kontroli wygląda na to, że MediaBrowserServiceCompat z MediaBrowserServiceCompat nigdy nie jest wywoływana i tym samym nigdy nie zapełni mojego MediaItemCompat na liście aplikacji Auto.

Mój manifest zawiera następujące elementy.

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

Moi automotive_app_desc.xml jest bardzo prosta, tylko deklarujące media.

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

My MediaService rozciąga MediaBrowserServiceCompat. W modelu onCreate() tworzę i konfiguruję mój 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); 
} 

Wreszcie, dwa z MediaBrowserServiceCompat nadpisane metody, z których żaden nie jest nigdy wywołana.

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

O ile mogę powiedzieć, że to wszystko, co konieczne, aby uzyskać Android Auto zaczęło, jeszcze kiedy otworzyć aplikację na moim radioodtwarzacza pulpit, istnieje tylko ProgressBar witając mnie, a kiedy otworzy off - szuflada na wyświetlacz - jest jeszcze jedna. Nie słyszałem o tym stanie w jakimkolwiek materiale, który przeczytałem. Czy jest coś, co przeoczyłem?

Odpowiedz

8

Ostatecznie problem nie miał nic wspólnego z tym, co opisałem. Wspomniany wcześniej MediaService wykonuje także inne zadania wymagające niestandardowego Binder. Ten niestandardowy Binder nie wywoływał onGetRoot() potrzebnego dla jednostki głównej. Jako rozwiązanie sprawdzam działanie Intent i zwracam super.onBind(), gdy jest z poziomu MediaBrowserServiceCompat.

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

SERVICE_INTERFACE jest stałym MediaBrowserServiceCompat.

+1

Dziękuję bardzo za opublikowanie tego rozwiązania.Debugowałem to od wielu godzin. –

0

Zajmuję Android auto ale mam pewne problemy w tej części mojego kodu w Onbind metody usługi:

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

mam inne działania związane z moich usług przez musicBind IBinder, ale z drugiej strony ustawiłem wszystkie rzeczy, aby podłączyć moją aplikację w interfejsie autorskim Androida, ale po zamknięciu mojej aplikacji po odłączeniu urządzenia od Androida w Androidzie nie mogę przestać akceptować mojego mediabrowserservice. Myślę, że to z powodu tego, że SERVICE_INTERFACE utrzymuje powiązanie z usługą. Jak mogę zatrzymać lub zniszczyć to z tego samego servicemediabrowserservicecompat?

+1

Witamy w przepełnieniu stosu. To nie jest odpowiedź na pytanie, to komentarz/nowe pytanie. Gdy uzyskasz wystarczającą reputację (50), będziesz mógł komentować każdy post. W międzyczasie możesz zyskać reputację [** zadając własne pytania **] (http://stackoverflow.com/help/how-to-ask) lub [** udzielając odpowiedzi na tematów **] (http://stackoverflow.com/help/how-to-answer). – Vickel

Powiązane problemy