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 呢? ...
随机推荐
- thinkphp安装不成功可能跟数据库名有关
今天ytkah在安装thinkphp时提示无法连接数据库,删除数据库重新连接不行,更新了mysql版本也不行,后面就干脆换一个数据库名居然可以了.之前的数据库名包含大写字母,就是因为这个问题才导致安装 ...
- svn .a文件上传不了
最近mac电脑出现了问题,导致硬盘被格式化,所有文件都没了,打开app,一直缺少第三方文件libWeChatSDK.a,打开xcode文件变红了,找不到了,为了预防此类问题,在这里给出解决方法,如果没 ...
- MySQL表操作及数据操作
表操作 表相当于一个文件,其形式与现实中的表格相同.表中的每条记录都有相应的字段,字段就类似于表格的表头. 表操作详细: #对表进行操作(文件) #首先要切换到指定库(即文件夹)下:use db1; ...
- 006-docker-安装-nginx
1.搜索镜像 docker search nginx 2.拉取合适镜像 docker pull nginx docker images 3.使用镜像 docker run -p 8080:80 --n ...
- K-means &K-medoids 聚类
k-平均值算法对孤立点很敏感!因为具有特别大的值的对象可能显著地影响数据的分布. k-中心点(k-Medoids): 不采用簇中对象的平均值作为参照点, 而是选用簇中位置最中心的对象, 即中心点(me ...
- 华为核心交换机绑定IP+MAC+端口案例
1 案例背景 某网络改造项目,核心交换机为华为S5700,接入交换机为不同型号交换机,如下模拟拓扑,客户端接入交换机1通过Access模式与核心交换机连接,该交换机下只有一个Vlan2 ...
- CMB面试准备-基础
1.简述 private. protected. public. internal 修饰符的访问权限 private : 在类的内部才可以访问. protected : 保护成员,该类内部和继承类中可 ...
- [LeetCode] 455. Assign Cookies_Easy tag: Sort
Assume you are an awesome parent and want to give your children some cookies. But, you should give e ...
- selenium + python 测试环境搭建 (WINDOWS)
1. 下载Python , 运行.exe -> http://python.org/getit/ 2. 下载Python Setuptools 基础包管理工具安装,官方文档参考 https:// ...
- Cocos Creator 为Button添加事件的两种方法
Button添加事件 Button 目前只支持 Click 事件,即当用户点击并释放 Button 时才会触发相应的回调函数.通过脚本代码添加回调方法一这种方法添加的事件回调和使用编辑器添加的事件回调 ...