Android Automotive 认为语音是在确保安全驾驶的同时进行互动的关键组件,也是用户在驾车期间与 Android Automotive OS 互动的最安全方式之一。因此,现有的 Android 语音助理 API(包括 VoiceInteractionSession)经过了扩展,使语音助理能够为用户执行那些在驾车时难以完成的任务。

利用点读功能,语音助理能够在用户与消息通知互动时朗读短信,并代表用户进行回复。如需提供此功能,您可以将语音助理与 CarVoiceInteractionSession 集成。

在 Automotive 中,发布到通知中心并被标识为 INBOX 或 INBOX_IN_GROUP 通知(如短信)的通知将包含一个“播放”操作按钮。通过此按钮,用户可以用选定的 VIA 朗读通知,并可以选择通过语音回复。

图 1. 点读通知

与 CarVoiceInteractionSession 集成

1. 支持 VoiceInteractions

提供车载设备语音交互服务的应用必须与现有的 Android 语音交互服务集成(VoiceInteractionSession 除外)。虽然 Voice Interaction API 中的所有其他组件都与在移动设备上实现时相同,但 CarVoiceInteractionSession(如下所述)取代了 VoiceInteractionSession。如需了解详情,请参阅以下文章:

2. 实现 CarVoiceInteractionSession

对比 CarVoiceInteractionSession 和 VoiceInteractionSession 就会发现,它们主要的区别在于,CarVoiceInteractionSession 会在 onShow 中传入操作,因此语音助理能够在 CarVoiceInteractionSession 启动会话后立即检测到用户请求的背景信息。

CarVoiceInteractionSession

VoiceInteractionSession

onShow 采用以下三个参数:

args

showFlags

actions

onShow 采用以下两个参数:

args

showFlags

Android 10 中的变化

从 Android 10 开始,平台会调用 VoiceInteractionService.onGetSupportedVoiceActions,如下所示:public class MyInteractionService extends VoiceInteractionService {

private static final ListSUPPORTED_VOICE_ACTIONS = Arrays.asList(

CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION);

@Override

public SetonGetSupportedVoiceActions(@NonNull SetvoiceActions) {

Setresult = new HashSet<>(voiceActions);

result.retainAll(SUPPORTED_VOICE_ACTIONS);

return result;

}

}

下表中介绍了有效的操作。如需详细了解各项操作,请参阅下文中的序列图。

操作

预期载荷

预期语音互动操作

VOICE_ACTION_READ_NOTIFICATION

向用户朗读消息,然后在成功朗读完消息后触发“标记为已读”待处理 intent。(可选)提示用户回复。

VOICE_ACTION_REPLY_NOTIFICATION

提示用户讲出回复消息,将回复消息输入到待处理 intent 的 RemoteInputReply 中,然后触发该待处理 intent。

VOICE_ACTION_HANDLE_EXCEPTION

包含键的字符串。

KEY_EXCEPTION(映射到 ExceptionValue,如下所述)。

KEY_FALLBACK_ASSISTANT_ENABLED(映射到某个布尔值)。如果该布尔值为 true,则说明能够处理用户请求的后备助理已停用。

需要针对异常采取的预期操作将在相应异常的文档中指定。

ExceptionValue

3. 请求通知监听器权限

如果默认的语音助理没有通知监听器权限,平台的 FallbackAssistant(如果已由汽车制造商启用)可以在系统通知语音助理请求相应权限之前朗读消息。为了确定 FallbackAssistant 是否启用并已经朗读了消息,语音助理应检查载荷中的 KEY_FALLBACK_ASSISTANT_ENABLED 布尔值。

平台建议语音助理添加与此权限的请求次数有关的速率限制逻辑。这样做尊重了那些不想向语音助理授予此权限,而更希望由 FallbackAssistant 朗读短信的用户。如果每次用户按下消息通知上的“播放”按钮时系统都提示该用户授予权限,可能会导致用户体验不佳。平台不会代表语音助理实施速率限制。

在请求通知监听器权限时,语音助理应使用

4. 使用 StatusBarNotification

随“朗读”和“回复”语音操作传入的 StatusBarNotifications 总是包含在与车载设备兼容的消息通知中,如向用户提供消息通知中所述。虽然某些通知可能没有“回复”待处理 intent,但所有通知都有“标记为已读”待处理 intent。

如需简化与通知的互动,请使用 NotificationPayloadHandler,它提供的多种方法可以从通知中提取消息,并将回复消息写入通知的相应待处理 intent 中。语音助理朗读完消息后,必须触发“标记为已读”intent。

5. 满足点读前提条件

当用户触发朗读和回复消息的语音操作时,只有默认语音助理的 VoiceInteractionSession 才会收到通知。如上所述,此默认语音助理还必须拥有通知监听器权限。

序列图

以下各图展示了 CarVoiceInteractionSession actions 的逻辑流。

图 2. VOICE_ACTION_READ_NOTIFICATION 的序列图

如果遇到下面图 3 中的情况,建议对权限请求应用速率限制。

图 3. VOICE_ACTION_REPLY_NOTIFICATION 的序列图

图 4. VOICE_ACTION_HANDLE_EXCEPTION 的序列图

提示和技巧

朗读应用名称

如果您想让语音助理在朗读消息时读出消息传递应用的名称(比如,“小王在 Hangouts 中说…”),您应创建如下所示的函数,以确保读出正确的名称。

@Nullable

String getMessageApplicationName(Context context, StatusBarNotification statusBarNotification) {

ApplicationInfo info = getApplicationInfo(context, statusBarNotification.getPackageName());

if (info == null) return null;

Notification notification = statusBarNotification.getNotification();

// Sometimes system packages will post on behalf of other applications, so check this

// field for a system application notification.

if (isSystemApp(info)

&& notification.extras.containsKey(Notification.EXTRA_SUBSTITUTE_APP_NAME)) {

return notification.extras.getString(Notification.EXTRA_SUBSTITUTE_APP_NAME);

} else {

PackageManager pm = context.getPackageManager();

return String.valueOf(pm.getApplicationLabel(info));

}

}

@Nullable

ApplicationInfo getApplicationInfo(Context context, String packageName) {

final PackageManager pm = context.getPackageManager();

ApplicationInfo info;

try {

info = pm.getApplicationInfo(packageName, 0);

} catch (PackageManager.NameNotFoundException e) {

return null;

}

return info;

}

boolean isSystemApp(ApplicationInfo info) {

return (info.flags & ApplicationInfo.FLAG_SYSTEM) != 0;

}

android语音助手 源代码,语音助理点读功能  |  Android 开源项目  |  Android Open Source Project...相关推荐

  1. 读《借助开源项目,学习软件开发》总结

    读<借助开源项目,学习软件开发>总结 GitBook文章源地址:文章源地址 一.前言 准备条件:(1)一台能上网的电脑(2)首选系统Ubuntu,其次Windows 二.开始 (1)软件开 ...

  2. 【开源项目----Android OPenGLES渲染YUV视频文件】

    [开源项目----Android OPenGLES渲染YUV视频文件] OpenGLES对YUV渲染相关文章参考

  3. Android签名版本,签名版本以供发布  |  Android 开源项目  |  Android Open Source Project...

    Android 操作系统映像在两个地方使用加密签名: 映像中的所有 .apk 文件都必须经过签名.Android 软件包管理器通过下列两种方式使用 .apk 签名:更换应用时,必须使用与旧应用相同的密 ...

  4. android afw测试,测试设备配置  |  Android 开源项目  |  Android Open Source Project

    Android Enterprise (AE) 自动化测试框架是一个用于验证 Android 设备的企业级兼容性的测试套件.该套件包括配套应用.测试用例.配置文件和一个基于 cts-tradefed ...

  5. android10分区镜像,分区和映像  |  Android 开源项目  |  Android Open Source Project

    分区 Android 设备包含若干个分区,这些分区在启动过程中发挥不同的作用.为了支持 A/B 更新,设备需要为 boot.system.vendor 和 radio 分区分别单独配置一个槽位. bo ...

  6. 安卓linux输入代码在哪里,输入  |  Android 开源项目  |  Android Open Source Project

    Android 输入子系统名义上由遍历系统多个层的事件管道组成. 输入管道 在最低层,物理输入设备会生成描述状态更改(例如按键按压和轻触接触点)的信号.设备固件以某种方式编码和传输这些信号,例如向系统 ...

  7. android midi 分析,MIDI 架构  |  Android 开源项目  |  Android Open Source Project

    本文将介绍不依赖于任何平台实现.API 或平台专用功能的通用 MIDI 架构. 主要概念 事件 该 MIDI 协议专为基于事件的通信而设计. 事件表示已经发生或即将在特定时间发生的事情.MIDI 事件 ...

  8. android的wifi直连,WLAN 直连  |  Android 开源项目  |  Android Open Source Project

    WLAN 直连功能又称"WLAN 点对点",它允许支持设备直接使用 WLAN 直连协议发现其他设备并与之互连(无需连接到互联网或移动网络).此功能是基于 Wi-Fi 联盟 (WFA ...

  9. android手机助手源代码,IOS Android 手机助手原理以及源码(cmake 构建)

    要在不同平台上构建不同的工程需要使用到构建工具,很多开源项目都是用的makefile,但是这东西并不怎么适合国人的习惯,我喜欢双击工程文件自动打开xcode或者vs2013.然后再开发工具里面写代码. ...

  10. android ble 助手源码_[源码和文档分享]基于Android的生活助手APP的设计与实现

    摘 要 随着移动互联网的高速发展,Android操作系统在移动设备中地位已经被牢牢稳固.然而大量的Android设备高速普及过程中,与其配套的Android应用的开发速度和项目质量极为令人担忧.本课题 ...

最新文章

  1. 用.NET创建Windows服务
  2. C#获取指定坐标点像素,效率更高快
  3. 了解HAProxy原理及参数
  4. APM - 零侵入监控Service服务
  5. MyBatis 插件原理与自定义插件-用代理模式我们就要解决几个问题
  6. WPF学习笔记(二):初学者避坑实录
  7. 前端学习(3315):UI提取
  8. javascript 小结
  9. NYOJ-聪明的kk(dp)
  10. 不使用手机代理,进行手机抓包
  11. 前端aes专用秘钥加解密_Javascript实现前端AES加密解密功能
  12. 王道 计算机网络试题讲解_王道考研 计算机网络(7)学习笔记
  13. 微信充错服务器,微信话费充错了怎么追回来(只需一招即可追回)
  14. canopen服务器协议,CANopen协议详情讲解.docx
  15. APUE-第5章 标准IO库
  16. 使用 Mac 位置定位服务的应用的操作方法
  17. iot架构 mqtt netty_百度IoT:MQTT Broker架构设计
  18. 人工智能算法对发明创造的知识产权保护
  19. 快捷生成HTML代码的实现
  20. 感谢开源,让我的青春永不褪色!

热门文章

  1. failed to req API:/nacos/v1/ns/instance after all servers([192.168.43.148:8848]) tried: ErrCode:503,
  2. 小学计算机教师应聘简历,应聘小学教师的个人简历模板
  3. 全球最顶级的十大创新公司
  4. Xcode 6 console
  5. 3GPP 5GNR 物理层协议梳理
  6. 混合引用制作 九九乘法表
  7. 服务器 多显卡 显示器,一台主机接多个显示器,居然有三种方法实现,提高工作效率的神器...
  8. 关于工商银行网站打不开的问题终极解决办法
  9. 破解justinmind方法,简单有效
  10. android 8.1 wifi感叹号,Android 网络图标上的感叹号(更新Android 7.1.1/Android 8)