Android auto 对接步骤

1、在对应工程的manifest里添加支持Androidauto的注册信息:

<application>

...

<meta-data android:name="com.google.android.gms.car.application" android:resource="@xml/automotive_app_desc"/>

...

<application>

其中automotive_app_desc.xml路径为res/xml/下,信息内容如下:

<automotiveApp>

<uses name="media"/>

</automotiveApp>

 

2、在工程的manifest里声明media browser service,内容例如:

<application>

...

<service android:name=".MyMediaBrowserService" android:exported="true">

<intent-filter> <action android:name=

"android.media.browse.MediaBrowserService"/> </intent-filter>

</service>

...

<application>

3、如果需要通知,可以在manifest里添加对应的通知内容,例如:

<application>

...

<meta-data android:name="com.google.android.gms.car.notification.SmallIcon" android:resource="@drawable/ic_notification" />

...

<!--如果要支持搜索,需要添加搜索消息-->

<activity> <intent-filter>

<action android:name= "android.media.action.MEDIA_PLAY_FROM_SEARCH" />

<category android:name= "android.intent.category.DEFAULT" />

</intent-filter>

</activity>

<application> 4、新建自己的MediaBrowserService,该service要继承MediaBrowserServiceCompat,主要实现以下内容:

1)、在onCreate里注册media session、注册音乐状态相关的回调、设置当前的session和关联回调

public void onCreate() {

    。。。。。

//具体处理Androidauto相关的逻辑

    mProvider = new AutoMediaProvider(this, this);

//注册media session

    mSession = new MediaSessionCompat(this, TAG);

//设置session和播放器的关联

    mPlayer = new AutoPlayerManager(this, mSession, mProvider, this);

    setSessionToken(mSession.getSessionToken());

    mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS

            | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

    // 设置seesion的回调和播放状态的回调关联

    mSession.setCallback(new AutoSessionCallback(this, mSession, mPlayer, mProvider));

    。。。。。。

}

 

2)、针对media连接状态做相应的处理,(比如此时APP本身在播放音乐,Androidauto连接上了,并来了播放消息,此时应该让之前的停止,只播放Androidauto的播放)最好在定义的MediaBrowserService里注册下面的广播:

IntentFilter filter = new IntentFilter("com.google.android.gms.car.media.STATUS"); BroadcastReceiver receiver = new BroadcastReceiver() {

。。。。。。

public void onReceive(Context context, Intent intent) {

String status = intent.getStringExtra("media_connection_status"); boolean isConnectedToCar = "media_connected".equals(status);

// adjust settings based on the connection status

}

};

registerReceiver(receiver, filter);

 

3)、针对onGetRoot、onLoadChildren、onLoadItem(目前没用到),填入获取到的目录列表信息、歌曲信息到MediaBrowserCompat.MediaItem里,返回给Androidauto。其中将APP本身的目录列表转换为MediaBrowserCompat.MediaItem时需要自己制定相关规则,然后下一级目录解析的时候又按照之前的规则解析出来:例如目前我们转化的方式为将基本信息按照信息间添加“-”转化为STRING作为MediaId,然后再按照“-”将传过来的MediaId解析出来,作下一次请求:

{

。。。。。

AutoMediaId id = AutoMediaId.buildMediaId(channel.getType(), null, null,AutoMediaId.MEDIA_ITEM_FLAG_CHANNEL, null);

Bundle extras = new Bundle();

id.putExtra(extras);

MediaDescriptionCompat desc = new MediaDescriptionCompat.Builder()

.setMediaId(id.toString())

.setTitle(channel.getName())

.setIconUri(Uri.parse("http://www.easyicon.net/api/resizeApi.php?id=1206029&size=128"))

.setExtras(extras)

.build();

 

MediaBrowserCompat.MediaItem item = new MediaBrowserCompat.MediaItem(desc, MediaBrowserCompat.MediaItem.FLAG_BROWSABLE);//FLAG_BROWSABLE为目录,如果想后面结束目录FLAG_PLAYABLE,后面Androidauto就会直接调用播放相关的消息。

。。。。。

}

 

public static final String SPLITOR = "-";

/** bundle keyword media TAG: channel */

public static final String MEDIA_TAG_CHANNEL = "CHN";

/** bundle keyword media TAG: album */

public static final String MEDIA_TAG_ALBUM = "ABM";

/** bundle keyword media TAG: album */

public static final String MEDIA_TAG_ID = "ID";

/** bundle keyword media TAG: level */

public static final String MEDIA_TAG_LEVEL = "LVL";

/** bundle keyword media TAG: extra */

public static final String MEDIA_TAG_EXTRA = "EXTRA";

public String toString() {

String mediaId = "";

if (TextUtils.isEmpty(mId)) {

return mediaId;

}

 

mediaId = MEDIA_TAG_ID + mId;

 

mediaId += TextUtils.isEmpty(mChannel) ? "" : SPLITOR + MEDIA_TAG_CHANNEL + mChannel;

mediaId += TextUtils.isEmpty(mAlbum) ? "" : SPLITOR + MEDIA_TAG_ALBUM + mAlbum;

mediaId += TextUtils.isEmpty(mLevel) ? "" : SPLITOR + MEDIA_TAG_LEVEL + mLevel;

mediaId += TextUtils.isEmpty(mExtra) ? "" : SPLITOR + MEDIA_TAG_EXTRA + mExtra;

return mediaId;

}

解析方式:

public static AutoMediaId parseMediaId(String mediaId) {

AutoMediaId media = new AutoMediaId();

if (TextUtils.isEmpty(mediaId)) {

return media;

}

String[] elements = mediaId.split(SPLITOR);

for (int i = 0; i < elements.length; i++) {

if (elements[i].startsWith(MEDIA_TAG_CHANNEL)) {

media.mChannel = elements[i].substring(MEDIA_TAG_CHANNEL.length());

} else if (elements[i].startsWith(MEDIA_TAG_ALBUM)) {

media.mAlbum = elements[i].substring(MEDIA_TAG_ALBUM.length());

} else if (elements[i].startsWith(MEDIA_TAG_ID)) {

media.mId = elements[i].substring(MEDIA_TAG_ID.length());

} else if (elements[i].startsWith(MEDIA_TAG_LEVEL)) {

media.mLevel = elements[i].substring(MEDIA_TAG_LEVEL.length());

} else if (elements[i].startsWith(MEDIA_TAG_EXTRA)) {

media.mExtra = elements[i].substring(MEDIA_TAG_EXTRA.length());

}

}

return media;

}

 

5、新建自己的AutoSessionCallback,该callback继承MediaSessionCompat.Callback,实现onPlayFromMediaId、onPlayFromUri、 onPlay()、onPause()、 onStop()、onPlayFromSearch、 onSkipToPrevious()、onSkipToNext()、onSeekTo(long pos)、onCustomAction(String action, Bundle extras)等主要方法。

 

其中onPlayFromSearch提供的是Androidauto的搜索接口;另外,如果要展示播放列表,需要将mSession里添加MediaSessionCompat.QueueItem;如果要添加自定义的icon操作,要在mSession里添加 PlaybackStateCompat.Builder,PlaybackStateCompat.Builder 里添加statBuilder.addCustomAction。


版权声明:本文为seemon163原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>