一、Android Auto 概述

最近物联网是比较热门的话题,做为物联网重要的一部份车联网也被众多汽车厂商越来越重视,纷纷推出自己的车联网系统。谷歌也是看到了车联网的重要性于2014年6月推出了Android Auto系统。它是谷歌生态系统的一个重要终端。说它是个系统其实并不完全准确,因为谷歌并没有提供完整的操作系统,而是提供了一套Android Auto SDK给汽车厂商。汽车厂商需要把这套Android Auto SDK 集成到他们自己的车载操作系统中。当然你也可以用这个SDK集成到谷歌的Android系统中。为了构建Android Auto生态圈,谷歌与汽车厂商共同组建“开放汽车联盟”(Open Automotive Alliance),已经有40多个汽车厂商加入。

Android Auto主要提供了语音,导航,IM,音乐,电话等几大核心功能。提供开发接口的目前只有音乐,IM两类应用。

二、Android Auto 使用方法

Android Auto是如何与手机连接并使用的呢?你必须使用Android 5.0以上手机并支持google api(原生系统),通过USB(最新版本支持Wifi)与支持Android Auto 的车机连接,当你在车机上选择音乐时,在音乐界面里会列出手机上支持Android Auto 的音乐应用,你选择连接某个应用。这样就可以播放音乐了。如下图:

三、Android Auto 连接方式及原理

Android Auto车机与手机连接,是同时通过USB(或者Wifi)及蓝牙来实现。蓝牙只用来通话作用,USB(或者Wifi)主要用来传送应用图像、车机的触摸事件及音频数据。所有的程序运行都在手机端,车机端只是用来显示及回传事件。具体原理如下图:

上图左边是车机,右边是手机。从这个图我们可以看出来,手机这边在Android 5.0及以上系统已经集成了Android Auto的SDK。车机侧需要使用Android Auto的SDK集成到车机系统,比如:WinCE,QNX,Linux等。但通话还是通过标准的蓝牙HFP来实现。

四、Android Auto应用开发

刚才已经说了,目前Android Auto支持开发的接口应用只有音乐和消息两类应用。我这里主要讲一下音乐的开发过程。

1.创建新应用支持Android Auto

以Android Studio为例,这个与创建普通应用差别不大,但有一个地方需要注意,如下图:

在选择你要运行的平台时,选择支持Android Auto。

这里需要你选择要开发的音乐应用还是消息应用,这里我们选择音乐类。这样就完成了支持Android Auto音乐功能应用的创建。

2.现有应用中加入Android Auto的支持

直接在现在项目中选择File->New->Android Auto->Media service就可以了。注意此时你的项目最小SDK必须是21以上,否则Media service为灰色,你无法创建。具体如下图:

3.支持Android Auto的应用配置

以上两种方式无论你按那种方式完成,我们都会发现在你应用的XML目录里新建一个xml,比如:automotive_app_desc.xml,打开XML有以下内容:

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

这里标识了应用的类型,这里是media,表示是支持Android Auto的音乐应用。 在AndroidManifest.xml中加入以下内容来标识应用支持Android Auto功能:

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

4.Android Auto的界面定制

先来看一下Android Auto音乐类的界面

说是界面定制,实际上你除了换颜色其它什么都不能做了,如上图,你只能改变1和2的颜色,他们分别对应到res->values->styles.xml里1-colorPrimaryDark 2-colorAccent的两个值。

5.获取连接上车机的广播

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

通过接收com.google.android.gms.car.media.STATUS的广播,来判断当前应用是否已经连接上了车机。

6.判断目前是否处于车机模式

public static booleanisCarUiMode(Context c) {
UiModeManageruiModeManager=(UiModeManager)c.getSystemService(Context.UI_MODE_SERVICE);
if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_CAR) {
Log.d(TAG, "Running in Car mode");
return true;
} else {
Log.d(TAG, "Running on a non-Car mode");
return false;
}
}

7.继承实现服务MediaBrowserService

MediaBrowserService也是继承Servcie,这个服务中车机用来浏览及显示歌曲列表的功能。和一般服务一样,我们需要在AndroidManifest.xm声明服务:

<application>
...
<service android:name=".QQMusicAndroidAutoService"
android:exported="true">
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService"/>
</intent-filter>
</service>
...
<application>

这里需要注意:exproted必须为true,允许外部调用。与普通服务最大的不同就是必须要实现两个接口:

public BrowserRooton GetRoot(String clientPackageName, intclientUid, Bundle rootHints);
public void onLoadChildren(final String parentMediaId, final Result<List<MediaItem>> result);

我们就是通过上面两个接口来获取歌曲列表。onGetRoot这个接口是用来获取歌曲列表根目录。第一个参数是车机获取根目录的的应用的包名,你可以根据包名来判断是否允许指定的车机应用来读取根目录信息。我们只要简单返回

return new BrowserRoot("root", null); 

就可以了。onLoadChildren这个接口是用来获取歌曲列表子目录。根据第一个参数parentMediaId来确认要获取那个目录的子目录或者歌曲列表,第二参数result是要返回的子目录或者歌曲列表。通过上面两个接口的实现,我们就可以在车机上浏览歌曲列表了。

8.播放控制

要实现播放控制,就要使用Android5.0 的全新的MediaSession,它用于播放器与控制器之间进行交互,它取代之前的RemoteControlClient。 先来看一下如何创MediaSession,具体如下:

MediaSessionmSession = new MediaSession(this, "QQMusicAndroidAuto");
mSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
mSession.setCallback(new MediaSessionCallback());

这里有两个重要方法:setCallback和setFlags,我们分别来看一下。setFlags是来设置这个MediaSeccion的功能。 FLAG_HANDLES_MEDIA_BUTTONS 设置此标志可以处理媒体按钮事件。 FLAG_HANDLES_TRANSPORT_CONTROLS 设置此标志以可以处理传输控制命令 setCallback是用来设置车机操作的回调,这个回调是MediaSession的内部接口Callback,需要我们实现,比较重要的几个接口如下:

private final class MediaSessionCallback extends MediaSession.Callback {
@Override
public void onPlay(){};
@Override
public void onSeekTo(long position){};
@Override
public void onPlayFromMediaId(String mediaId, Bundle extras){};
@Override
public void onPause(){};
@Override
public void onSkipToNext(){};
@Override
public void onSkipToPrevious(){};
@Override
public void onCustomAction(String action, Bundle extras){};
@Override
public void onPlayFromSearch(final String query, final Bundle extras){};
}
onPlay:播放暂停后恢复播放调用
onSeekTo:跳转到某个时间点播放
onPlayFromMediaId:用户选定某个歌曲播放
onPause:暂停播放
onSkipToNext:播放下一首
onSkipToPrevious:播放上一首
onCustomAction:自定命令
onPlayFromSearch:搜索命令

以上各自分别实现就可以了。最后MediaBrowserServicer通过

setSessionToken(mSession.getSessionToken());

来设置MediaSession到服务。

五、Android Auto开发总结

总的来说,开发还是相对简单,只要实现几个接口就可以了,界面用户可以不用关心。对开发者来说,只要提供数据就可以了。这大大减轻了开发者的工作,快速实现功能,但这也是缺点,无法实现自己定义的界面,界面单一。

参考文档:

  1. 谷歌Android Auto开发官网: https://developer.android.com/training/auto/index.html

Android Auto开发初探的更多相关文章

  1. Android Auto开发之一《开始学习Auto 》

    共同学习,共同进步, 转载请注明出处.欢迎微信交流:sfssqs,申请注明"Android Car"字样 ================= =================== ...

  2. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  3. Android NFC开发(一)——初探NFC,了解当前前沿技术

    Android NFC开发(一)--初探NFC,了解当前前沿技术 官方文档:http://developer.android.com/guide/topics/connectivity/nfc/ind ...

  4. Android Camera开发:周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled)

    参考:Android Camera开发:扫描二维码,周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled) 最近做Android人脸识别时,camera在自 ...

  5. 热烈庆祝华清远见2014嵌入式系统(Linux&Android)开发就业培训课程全面升级

    近日,华清远见公开宣布:2014嵌入式系统 (Linux&Android)开发就业培训课程再次升级!据悉,华清远见如今已经持续10年,一直保持课程每年2次的更新的频率.华清远见的每 次课程更新 ...

  6. 谷歌宣布Android auto目前的汽车系统汽车市场的影响

    由于2007年.汽车导航产品已经得到长足的发展.其产品主要用于WinCE制.除了导航功能,通常有收音机,播放光盘.广播SD卡/U音频和视频盘,蓝牙手机,倒车后视功能.由于WinCE微软放弃系统,And ...

  7. Android NFC开发(二)——Android世界里的NFC所具备的条件以及使用方法

    Android NFC开发(二)--Android世界里的NFC所具备的条件以及使用方法 NFC的应用比较广泛,而且知识面也是比较广的,所以就多啰嗦了几句,我还还是得跟着官方文档:http://dev ...

  8. 基于Unity的AR开发初探:第一个AR应用程序

    记得2014年曾经写过一个Unity3D的游戏开发初探系列,收获了很多好评和鼓励,不过自那之后再也没有用过Unity,因为没有相关的需求让我能用到.目前公司有一个App开发的需求,想要融合一下AR到A ...

  9. 跟我学Android NDK开发(一)

    Android NDK 开发跟其它开发一样,首先需要配置好开发环境,本文以 Ubuntu系统为例介绍如何进行 Android NDK 开发环境的配置. 1. 简介 什么是 Android NDK 呢? ...

随机推荐

  1. what's the 爬虫之基本原理

    what's the 爬虫? 了解爬虫之前,我们首先要知道什么是互联网 1.什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,总体上像一张网一样. 2.互联 ...

  2. what's the python之变量、基本数据类型

    what's the 变量? Python 中的变量赋值不需要类型声明. 变量在内存中创建,包括变量的标识,名称和数据. 变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 等号(=)用来给变量赋 ...

  3. 这套方法论,彻底终结MySQL同步延迟问题

    作者介绍 张秀云,网名飞鸿无痕,现任职于腾讯,负责腾讯金融数据库的运维和优化工作.2007年开始从事运维方面的工作,经历过网络管理员.Linux运维工程师.DBA.分布式存储运维等多个IT职位.对Li ...

  4. Emmagee——开源Android性能测试工具

    工具:Emmagee作者:孔庆云 网易(杭州)质量保证部 开源地址:https://github.com/NetEase/Emmagee Wiki:https://github.com/NetEase ...

  5. React篇-滚动条下移的触发在react的生命周期分析

    项目的要求是一个chartUI方式的聊天显示页面,根据聊天信息的不断增加,页面需要滑动一定距离,这样能看到最新的聊天结果,这样就需要在聊天结果返回之后触发滚动条向下滚动到一定的距离,代码如下: com ...

  6. IOP知识点(4)

    1.选择多个“li”后,如何再次筛选. 2 按钮屏蔽功能 1.选择多个“li”后,如何再次筛选. 2 按钮屏蔽功能 http://gitserver/iop/cloud-iopm-web/issues ...

  7. Day1 Python基础学习——概述、基本数据类型、流程控制

    一.Python基础学习 一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编 ...

  8. 微信小程序实现简单的树形图treeview

    H5有很多树形图(树状图)的组件,echarts也有.比如像bootstrap的treeview,定制性很强.不过这些都无法方便地为小程序所用,除非整个页面用H5搭建再用webview框进去,有点粗暴 ...

  9. Dotfuscator代码混淆工具的使用

    关于Dotfuscator,VS自带了一个社区版的源代码保护工具,不过它只有基本的混淆命名的功能.专业版功能很多,可以混淆流程,密字符串,加入水印,程序签名等. 工具/原料   Dotfuscator ...

  10. 让运行着的ASP.NET Web程序重新启动

    在运行中的Web程序,会随时的监测这web.config文件的变化,只要web.config文件有变动,那么Application就会重新启动.所以,在一个工具类中我们可以封装一个方法,该方法用来重新 ...