Android Auto开发初探
一、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开发总结
总的来说,开发还是相对简单,只要实现几个接口就可以了,界面用户可以不用关心。对开发者来说,只要提供数据就可以了。这大大减轻了开发者的工作,快速实现功能,但这也是缺点,无法实现自己定义的界面,界面单一。
参考文档:
- 谷歌Android Auto开发官网: https://developer.android.com/training/auto/index.html
Android Auto开发初探的更多相关文章
- Android Auto开发之一《开始学习Auto 》
共同学习,共同进步, 转载请注明出处.欢迎微信交流:sfssqs,申请注明"Android Car"字样 ================= =================== ...
- Android开发学习之路--Android系统架构初探
环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...
- Android NFC开发(一)——初探NFC,了解当前前沿技术
Android NFC开发(一)--初探NFC,了解当前前沿技术 官方文档:http://developer.android.com/guide/topics/connectivity/nfc/ind ...
- Android Camera开发:周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled)
参考:Android Camera开发:扫描二维码,周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled) 最近做Android人脸识别时,camera在自 ...
- 热烈庆祝华清远见2014嵌入式系统(Linux&Android)开发就业培训课程全面升级
近日,华清远见公开宣布:2014嵌入式系统 (Linux&Android)开发就业培训课程再次升级!据悉,华清远见如今已经持续10年,一直保持课程每年2次的更新的频率.华清远见的每 次课程更新 ...
- 谷歌宣布Android auto目前的汽车系统汽车市场的影响
由于2007年.汽车导航产品已经得到长足的发展.其产品主要用于WinCE制.除了导航功能,通常有收音机,播放光盘.广播SD卡/U音频和视频盘,蓝牙手机,倒车后视功能.由于WinCE微软放弃系统,And ...
- Android NFC开发(二)——Android世界里的NFC所具备的条件以及使用方法
Android NFC开发(二)--Android世界里的NFC所具备的条件以及使用方法 NFC的应用比较广泛,而且知识面也是比较广的,所以就多啰嗦了几句,我还还是得跟着官方文档:http://dev ...
- 基于Unity的AR开发初探:第一个AR应用程序
记得2014年曾经写过一个Unity3D的游戏开发初探系列,收获了很多好评和鼓励,不过自那之后再也没有用过Unity,因为没有相关的需求让我能用到.目前公司有一个App开发的需求,想要融合一下AR到A ...
- 跟我学Android NDK开发(一)
Android NDK 开发跟其它开发一样,首先需要配置好开发环境,本文以 Ubuntu系统为例介绍如何进行 Android NDK 开发环境的配置. 1. 简介 什么是 Android NDK 呢? ...
随机推荐
- InnoDB体系架构
MySQL支持插件式存储引擎,常用的存储引擎则是MyISAM和InnoDB,通常在OLTP(Online Transaction Processing 在线事务处理)中,我们选择使用InnoDB,所以 ...
- idea structure窗口
https://blog.csdn.net/qq_19934363/article/details/87994000
- Python递归优化方法
递归栈溢出 Python的递归调用栈的深度有限制,默认深度为998,可以通过sys.getrecursionlimit()查看. 针对递归栈溢出,我们可以将默认深度设置为大一些,这样不会报错,但是再大 ...
- 实例讲解TP5中关联模型
https://blog.csdn.net/github_37512301/article/details/75675054 一.关联模型在关系型数据库中,表之间有一对一.一对多.多对多的关系.在 T ...
- 关于Go,你可能不注意的7件事
转自: https://tonybai.com/2015/09/17/7-things-you-may-not-pay-attation-to-in-go/ Go以简洁著称,但简洁中不乏值得玩味的小细 ...
- 云计算概述及Centos7下安装kvm虚拟机
云计算(cloud computing)是基于互联网的相关服务的增加.使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源 云计算到底是什么? 按定义:云计算指的是一种使用模式,是基 ...
- Spark SQL 函数全集
org.apache.spark.sql.functions是一个Object,提供了约两百多个函数. 大部分函数与Hive的差不多. 除UDF函数,均可在spark-sql中直接使用. 经过impo ...
- Spring MVC 简介及入门小例子
说明:文章内容全部截选自实验楼教程[Spring MVC 简易教程] 一.什么是 Spring MVC Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring ...
- [LeetCode] 130. Surrounded Regions_Medium tag: DFS/BFS
Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...
- Entity Framework学习初级篇1--EF基本概况《转》
最近在学习研究微软的EF,通过这时间的学习研究,感觉这个EF目前来说还不是很完善,半成品.不过,据说在.Net4.0中,微软将推荐使用此框架,并会有所改善.而且,现在基本上所有数据库均提供了对EF的支 ...