2016-07-26 87 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

相关问题