2016-07-26 86 views
6

我正在開發一個適用於Android的音頻流應用程序,並整合了Android Auto。我一直在關注這兩個教程。Android的自動應用程序永遠不會調用onGetRoot

Android Developer Training

PTR Android Blog

使用桌面股長,我能夠從媒體應用程序列表中選擇我的媒體應用程序,但是從那裏ProgressBar停留,而不是讓位給了「播放點擊左上角的菜單。「在Universal Music Player中看到的消息。

經過檢查,看起來MediaBrowserServiceCompatonGetRoot()永遠不會被調用,因此永遠不會將我的MediaItemCompat填充到自動應用列表中。

我的清單包含以下內容。

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

automotive_app_desc.xml很簡單,只宣稱媒體。

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

我的MediaService延伸MediaBrowserServiceCompat。在onCreate()我創建並設置我的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); 
} 

最後,從MediaBrowserServiceCompat兩個重寫的方法,其中既不曾被稱爲。

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

至於我可以告訴大家,這是得到一個Android的自動啓動,但是當我打開應用程序在我的桌面音響主機上,只有一個ProgressBar我打招呼,並且所需的一切,當我打開關閉屏幕導航抽屜,還有一個。在我讀過的任何材料中,我都沒有聽說過這種狀態。有什麼我錯過了嗎?

回答

8

最終,這個問題與我所描述的沒有任何關係。前述的MediaService也執行需要定製Binder的其他任務。該自定義Binder未調用主單元所需的onGetRoot()。作爲解決方案,我檢查Intent操作,並從MediaBrowserServiceCompat返回super.onBind()

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

SERVICE_INTERFACE的是在MediaBrowserServiceCompat常數。

+1

非常感謝發佈此解決方案。我一直在調試這個小時。 –

0

我開發一個Android的汽車,但我有我的這部分代碼存在一些問題,在Onbind方法的服務:

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

我通過musicBind IBinder我的服務綁定等活動,但另一方面,我已經設置了所有的東西來連接我的應用程序在Android的自動接口,但在關閉我的應用程序後斷開Android設備的設備我不能阻止我的mediabrowserservice compat。我認爲這是由於這個SERVICE_INTERFACE保持綁定的服務。我該如何停止或銷燬同樣的servicemediabrowserservicecompat

+1

歡迎來到Stack Overflow。這不是問題的答案,而是評論/新問題。一旦你有足夠的聲望(50) 你可以評論任何帖子。在此期間,您可以獲得聲譽 [**問自己的問題**](http://stackoverflow.com/help/how-to-ask)或[**提供關於 受試者**的答案]( http://stackoverflow.com/help/how-to-answer)。 – Vickel

相關問題