购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3.4 构建Android Auto即时通信应用

对许多驾驶员而言,通过信息保持联络非常重要。聊天应用可让用户知道是否需要接孩子,或者晚餐地点是否已更改。利用Android框架,即时通信应用可以使用标准界面将其服务扩展到驾驶体验中,让驾驶员专注于路况。

支持即时通信的应用可以扩展其即时通信通知,使Android Auto在运行时能够使用它们。这些通知显示在Auto中,让用户能够在一致且不易导致分心的界面中阅读和回复消息。此外,在使用 MessagingStyle API时,还可以从适用于所有Android设备(包括Android Auto)且经过优化的消息通知中获益。此类优化包括专用于消息通知的界面、改进的动画,以及对内嵌图片的支持。

(1)使用入门

如需让应用为Auto设备提供即时通信服务,该应用必须能够执行以下操作:

·构建并发送NotificationCompat.MessagingStyle对象,这些对象包含回复和“标记为已读”Action对象。

·通过 Service 处理回复并将对话标记为已读。

·配置清单,表明该应用支持Android Auto。

一个通信块称为“一条消息”,由MessagingStyle.Message类表示。消息包含发送者、消息内容以及消息发送时间。

用户之间的通信称为“对话”,由 MessagingStyle对象表示。对话(或MessagingStyle)包含标题、若干消息以及这是不是群组对话(即对话具有多个其他接收者)。

为了向用户通知对话更新(例如,有新消息),应用会向Android系统发布Notification。此Notification使用MessagingStyle对象在通知栏中显示即时通信专用界面。Android平台还会将此Notification传递给Android Auto,然后系统会提取MessagingStyle 并用其通过汽车的显示屏发布通知。

应用还可以向Notification添加Action对象,使用户能够直接在通知栏中快速回复消息或将消息标记为已读。Android Auto需要使用“标记为已读”和回复Action对象,以便管理对话。

总而言之,单个对话由一个Notification对象表示,该对象使用一个MessagingStyle对象设置样式。MessagingStyle包含对话中的所有消息,它含有一个或多个MessagingStyle.Message对象。最后,为了全面符合Android Auto规范,必须将回复和“标记为已读”Action附加到Notification。

用户的应用与Android Auto之间的典型即时通信流其基本流程如下:

①应用收到一条消息。

②应用生成包含回复和“标记为已读”Action的MessagingStyle通知。

③Android Auto从Android系统收到“新通知”事件,然后查找MessagingStyle、回复Action 和“标记为已读”Action。

④Android Auto 生成通知并显示在汽车显示屏上。

⑤如果用户通过汽车显示屏点击通知,Android Auto会触发“标记为已读”Action。在后台,应用必须处理这个标记为已读事件。

⑥如果用户通过语音响应通知,Android Auto 会将用户响应转录包含到回复 Action中,然后触发此操作。

在后台,应用必须处理此回复事件。

以下代码示例包含用户的应用在开始支持使用Android Auto进行即时通信之前应具备的一些功能:

(2)声明Android Auto支持

当Android Auto收到来自即时通信应用的通知时,会检查该应用是否声明了Android Auto支持。如需启用此支持,将在应用的清单中添加以下条目:

此清单条目引用应创建的另一个XML文件,其路径为YourAppProject/app/src/main/res/xml/automotive_app_desc.xml,该文件中声明了应用所支持的Android Auto功能。例如,若要包括对通知的支持,请在automotive_app_desc.xml中添加以下代码:

如果需要支持处理短信、彩信和RCS,还必须添加以下代码:

(3)导入AndroidX核心库

构建用于Auto设备的通知需要安装AndroidX核心库,可按如下方式将其导入项目中:

在顶层build.gradle 文件中,确保包含Google 的Maven代码库,如下所示:

在应用模块的build.gradle 文件中,添加AndroidX 核心库依赖项,如下所示:

(4)处理用户操作

即时通信应用需要一种通过Action处理对话更新的方式。对于Android Auto,应用需要处理两种Action对象:“回复”和“标记为已读”。推荐的方法是使用IntentService实现此目的。IntentService使系统能灵活地“在后台”处理可能十分占用资源的调用,从而释放应用的主线程。

1)定义Intent操作

Intent操作(不要与通知操作混淆)是简单的字符串,用于标识Intent的用途。因为一个服务可以处理多种类型的Intent,因此定义多个Intent.action字符串要比定义多个IntentService容易。

即时通信应用中,有两种类型的操作:“回复”和“标记为已读”,具体参见以下代码示例中的声明。

2)创建服务

如需创建处理这些Action的服务,需要对话ID和远程输入键。对话ID是由应用定义的任意数据结构,用来标识对话;远程输入键将在本节的后续内容中详细介绍。以下代码创建的就是这样一个服务。

如需将此服务与应用关联,还需要在应用的清单中注册该服务,如下所示:

3)生成和处理 Intent

其他应用无法获取触发MessagingService的Intent,因为每个Intent都是通过PendingIntent 传递给外部应用的。由于存在此限制,因此需要创建RemoteInput 对象以允许其他应用将“回复”文本提供给应用,如下所示:

接下来在MessagingService中处理ACTION_REPLY switch子句的TODO并提取该信息,如下所示:

“标记为已读”Intent 采用类似的处理方式,但不需要RemoteInput。

以下代码示例在MessagingService中处理ACTION_MARK_AS_READ switch子句的TODO:

(5)向用户提供消息通知

现在已完成即时通信应用对话操作处理,接下来生成符合 Android Auto 规范的通知。

1)创建操作

Action是可通过Notification传递到其他应用以在原始应用中触发方法的对象。Android Auto通过此方式将会话标记为已读并进行回复。

如需创建Action,请从Intent开始,如以下“回复”Intent所示:

然后将Intent封装在PendingIntent 中,以便为外部应用使用做好准备。PendingIntent通过以下方式限制对所封装Intent的所有访问:仅公开一组选定的方法,允许接收方应用触发 Intent或获取源应用的软件包名称,但绝不允许外部应用访问底层的Intent或其中的数据。

在设置回复Action时,请注意Android Auto对回复Action的三项要求:

·语义操作必须设置为Action.SEMANTIC_ACTION_REPLY。

·此Action必须指明在触发时不会显示任何界面。

·此Action必须包含单个RemoteInput。

以下代码示例在满足上述要求的同时设置回复 Action:

在“标记为已读”方面,采用相同的处理方式,只是没有RemoteInput。因此,Android Auto对“标记为已读”Action有两项要求:

·语义操作设置为 Action.SEMANTIC_ACTION_MARK_AS_READ。

·该操作指明在触发时不会显示任何界面。

注意 :生成PendingIntent时使用了两个方法:createReplyId()和createMarkAsReadId()。这两个方法相当于每个PendingIntent的请求代码,Android用它们控制各个现有的PendingIntent。换句话说,create()方法应返回唯一ID,但同一对话的重复调用应返回相同的唯一ID。例如,对于对话1,回复ID可以是100,标记为已读ID可以是101。对于对话2,回复ID可以是102,标记为已读ID可以是103。如果对话1发生更新,则回复和标记为已读ID仍将分别为100和101。如需了解详情,请参阅PendingIntent.FLAG_UPDATE_CURRENT。

2)创建MessagingStyle

MessagingStyle是即时通信信息的载体,供Android Auto朗读对话中的每条消息。首先,必须以Person对象的形式指定设备的用户。

然后,可以构建MessagingStyle对象并提供一些关于对话的详细信息。

最后,添加未读消息。

3)打包和推送通知

生成Action和MessagingStyle对象后,就可以构建并发布Notification。 AjXkgpqZ15lkTQ85keL36cuS4HKJzTUqt4q1fPEL2LOe+tQPwvyeyZbtD3A38HSg

点击中间区域
呼出菜单
上一章
目录
下一章
×