AR 眼镜之-蓝牙电话-来电铃声与系统音效

目录

📂 前言

AR 眼镜系统版本

蓝牙电话

来电铃声

系统音效

1. 🔱 Android9 原生的来电铃声,走的哪个通道?

2. 💠 Android9 原生的来电铃声,使用什么播放?

2.1 来电铃声创建准备

2.2 来电铃声播放过程

3. ⚛️ Android9 内部定义的系统音量,共有几类?

4. ✅ 蓝牙电话的来电铃声,使用手机 or 眼镜的来电铃声?是否与 SoundPool 播放的接听音效冲突?

4.1 手机铃声最大情况下

4.2 手机铃声静音情况下

4.3 结论


承接上一篇章:AR 眼镜之-蓝牙电话-实现方案

📂 前言

AR 眼镜系统版本

        W517 Android9。

蓝牙电话

        主要实现 HFP 协议,主要实现拨打、接听、挂断电话(AG 侧、HF 侧)、切换声道等功能。

  • HFP(Hands-Free Profile)协议——一种蓝牙通信协议,实现 AR 眼镜与手机之间的通信;

  • AG(Audio Gate)音频网关——音频设备输入输出网关 ;

  • HF(Hands Free)免提——该设备作为音频网关的远程音频输入/输出机制,并可提供若干遥控功能。

在 AR 眼镜蓝牙中,手机侧是 AG,AR 眼镜蓝牙侧是 HF,在 Android 源代码中,将 AG 侧称为 HFP/AG,将 HF 侧称为 HFPClient/HF。

来电铃声

        Andriod 来电的铃声默认保存在 system/media/audio/ 下面,有四个文件夹,分别是 alarms(闹钟)、notifications(通知)、ringtones(铃声)、ui(UI音效),源码中这些文件保存在 frameworks\base\data\sounds 目录下面。

系统音效

        Android 系统中,音量都是分开控制的,这些包括媒体、铃声、闹铃、蓝牙、通话以及通知,通过音频流来区别不同的音量类型,每种流类型都定义最大音量、最小音量及默认音量。

1. 🔱 Android9 原生的来电铃声,走的哪个通道?

        走的 STREAM_RING 通道,在 RingtoneFactory.getRingtone 中通过 setStreamType 指定通道为 AudioManager.STREAM_RING。

        RingtoneFactory:.\packages\services\Telecomm\src\com.android.server.telecom\RingtoneFactory

    public Ringtone getRingtone(Call incomingCall) {// Use the default ringtone of the work profile if the contact is a work profile contact.Context userContext = isWorkContact(incomingCall) ?getWorkProfileContextForUser(mCallsManager.getCurrentUserHandle()) :getContextForUserHandle(mCallsManager.getCurrentUserHandle());Uri ringtoneUri = incomingCall.getRingtone();Ringtone ringtone = null;int phoneId = TelecomUtils.getSlotIdForPhoneAccountHandle(incomingCall.getContext(),incomingCall.getTargetPhoneAccount());if(ringtoneUri != null && userContext != null) {// Ringtone URI is explicitly specified. First, try to create a Ringtone with that.ringtone = RingtoneManager.getRingtone(userContext, ringtoneUri);}if(ringtone == null) {// Contact didn't specify ringtone or custom Ringtone creation failed. Get default// ringtone for user or profile.RingtoneManagerEx.setSlotId(phoneId);Context contextToUse = hasDefaultRingtoneForUserForSlot(userContext, phoneId)? userContext : mContext;Uri defaultRingtoneUri;if (UserManager.get(contextToUse).isUserUnlocked(contextToUse.getUserId())) {defaultRingtoneUri = RingtoneManagerEx.getActualDefaultRingtoneUri(contextToUse,RingtoneManager.TYPE_RINGTONE, phoneId);} else {defaultRingtoneUri = phoneId == 1 ? Settings.System.DEFAULT_RINGTONE1_URI: Settings.System.DEFAULT_RINGTONE_URI;}if (defaultRingtoneUri == null) {return null;}ringtone = RingtoneManager.getRingtone(contextToUse, defaultRingtoneUri);}if (ringtone != null) {ringtone.setStreamType(AudioManager.STREAM_RING);}return ringtone;}

2. 💠 Android9 原生的来电铃声,使用什么播放?

        使用 MediaPlayer 播放,主要分为铃声创建准备、铃声播放过程(只考虑本地播放流程,暂不考虑远程播放流程使用 mRemotePlayer、以及本地和远程均播放失败使用 playFallbackRingtone 的情况)。

  1. .\packages\services\Telecomm 仓库:

    1. Ringer:\src\com.android.server.telecom\Ringer.java;

    2. AsyncRingtonePlayer:\src\com.android.server.telecom\AsyncRingtonePlayer.java;

    3. RingtoneFactory:\src\com.android.server.telecom\RingtoneFactory.java。

  2. .\frameworks\base 仓库:

    1. RingtoneManager:\media\java\android\media\RingtoneManager.java;

    2. Ringtone:\media\java\android\media\Ringtone.java;

    3. MediaPlayer:\media\java\android\media\MediaPlayer.java。

2.1 来电铃声创建准备

        Ringer.startRinging -> AsyncRingtonePlayer.play -> AsyncRingtonePlayer.handlePlay -> RingtoneFactory.getRingtone -> RingtoneManager.getRingtone -> Ringtone.setUri -> new MediaPlayer -> MediaPlayer.setDataSource.

2.2 来电铃声播放过程

        Ringer.startRinging -> AsyncRingtonePlayer.play -> AsyncRingtonePlayer.handlePlay -> AsyncRingtonePlayer.handleRepeat -> Ringtone.play -> Ringtone.startLocalPlayer -> MediaPlayer.start.

3. ⚛️ Android9 内部定义的系统音量,共有几类?

        一共6类,分别是 STREAM_VOICE_CALL、STREAM_RING、STREAM_MUSIC、STREAM_ALARM、STREAM_NOTIFICATION 以及 STREAM_BLUETOOTH_SCO。

  1. STREAM_VOICE_CALL:通话声音

  2. STREAM_RING:来电响铃

  3. STREAM_MUSIC:媒体声音(包括音乐,视频,游戏声音)

  4. STREAM_ALARM:闹钟声音

  5. STREAM_NOTIFICATION:通知声音

  6. STREAM_BLUETOOTH_SCO:蓝牙声音

    private final int[] STREAM_VOLUME_ALIAS_VOICE = new int[] {AudioSystem.STREAM_VOICE_CALL,      // STREAM_VOICE_CALLAudioSystem.STREAM_RING,            // STREAM_SYSTEMAudioSystem.STREAM_RING,            // STREAM_RINGAudioSystem.STREAM_MUSIC,           // STREAM_MUSICAudioSystem.STREAM_ALARM,           // STREAM_ALARMAudioSystem.STREAM_NOTIFICATION,    // STREAM_NOTIFICATIONAudioSystem.STREAM_BLUETOOTH_SCO,   // STREAM_BLUETOOTH_SCOAudioSystem.STREAM_RING,            // STREAM_SYSTEM_ENFORCEDAudioSystem.STREAM_RING,            // STREAM_DTMFAudioSystem.STREAM_MUSIC,           // STREAM_TTSAudioSystem.STREAM_MUSIC            // STREAM_ACCESSIBILITY};

注:

1)STREAM_SYSTEM 指系统声音,包括按键声音等,与 STREAM_RING 映射一样的音频通道,即:设置应用-声音-铃声可调节此值;

2)STREAM_MUSIC,即:设置应用-声音-媒体可调节此值;

3)STREAM_NOTIFICATION,即:设置应用-声音-通知可调节此值。

4. ✅ 蓝牙电话的来电铃声,使用手机 or 眼镜的来电铃声?是否与 SoundPool 播放的接听音效冲突?

        前提:蓝牙电话,眼镜铃声调到最大。

4.1 手机铃声最大情况下

  1. Mate 60:Android12,蓝牙电话来电铃声使用的眼镜铃声,有接听音效;——在“开发者人员选项”中打开“来电铃声同步(来电时,蓝牙设备播放手机铃声)”按钮开关后,蓝牙电话来电铃声使用的手机铃声,无接听音效;

  2. 小米 14:Android14,蓝牙电话来电铃声使用的眼镜铃声,有接听音效;——在“开发者人员选项”中没有“来电铃声同步“按钮开关;

  3. 华为 P9:Android8,蓝牙电话来电铃声使用的眼镜铃声,有接听音效;——在“开发者人员选项”中没有“来电铃声同步“按钮开关;

  4. Motorola:Android14,蓝牙电话来电铃声使用的手机铃声,无接听音效;

  5. VIVO X100:Android14,蓝牙电话来电铃声使用的手机铃声,无接听音效;

4.2 手机铃声静音情况下

  1. Mate 60:Android12,蓝牙电话来电铃声使用的眼镜铃声,有接听音效;——在“开发者人员选项”中打开“来电铃声同步(来电时,蓝牙设备播放手机铃声)”按钮开关后,蓝牙电话来电铃声有铃声且使用的手机铃声,无接听音效;

  2. 小米 14:Android14,蓝牙电话来电铃声使用的眼镜铃声,有接听音效;——在“开发者人员选项”中没有“来电铃声同步“按钮开关;

  3. 华为 P9:Android8,蓝牙电话来电铃声使用的眼镜铃声,有接听音效;——在“开发者人员选项”中没有“来电铃声同步“按钮开关;

  4. Motorola:Android14,蓝牙电话来电铃声无铃声,无接听音效;

  5. VIVO X100:Android14,蓝牙电话来电铃声无铃声,无接听音效;

4.3 结论

  1. 对于不同 Android 手机的蓝牙来电,使用的来电铃声不一样,Mate60、小米14、华为 P9 使用眼镜铃声,Mate60 打开“来电铃声同步“按钮开关后使用手机铃声,Motorola、VIVO X100 使用手机铃声;

  2. 有无接听音效与来电铃声相关,使用手机来电铃声无接听音效,使用眼镜来电铃声有接听音效——因为使用手机来电铃声会切换为蓝牙音频通道,导致眼镜使用 SoundPool 播放的接听音效未生效,待后续兼容。


另外,由于本人能力有限,如有错误,敬请批评指正,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/55231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国庆普及模拟2总结

目录 题目链接: 官方题解: 概述: 总结反思: 题目 T1: 题目分析: 错误代码: 错因: AC代码: T2: 题目分析: 赛时代码&#xf…

LeetCode[中等] 55.跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 思路 贪心算法 可达位置…

CSS中字体图标的使用

引言: 在网页设计当中,会有很多很简洁的图标,比如箭头,照相机,放大镜等 这些大概率都是使用字体图标来完成的,因为字体图标比较简洁高效,不会像图片一样需要向浏览器请求数据。那么字体图标该…

记一次vue路由跳转登陆之前的页面,参数丢失问题

一、背景 vue3.0,项目登陆之前访问某个可访问的页面,当跳转到需要登陆才能访问的页面时,跳转到登陆页面,登陆后再跳转到登陆之前需要登陆才能访问的页面,跳转时发现参数丢失了。 A页面(无需登陆)===> B页面(需要登陆)====> 如果未登陆跳转到C登陆页面 ===>…

什么是文件完整性监控(FIM)

组织经常使用基于文件的系统来组织、存储和管理信息。文件完整性监控(FIM)是一种用于监控和验证文件和系统完整性的技术,识别用户并提醒用户对文件、文件夹和配置进行未经授权或意外的变更是 FIM 的主要目标,有助于保护关键数据和…

《NoSQL》非关系型数据库MongoDB 学习笔记!

Mongo基础: 使用数据库: 使用use 命令 后面跟着要使用的数据库名字即可, 例如:use cities, 值得注意的是, mongo中不像mysql, 还需要先创建数据库,后访问, mongo中,你无…

数据库管理-第246期 为啥有些老板瞧不上技术(20241002)

数据库管理246期 2024-10-02 数据库管理-第246期 为啥有些老板瞧不上技术(202401002)1 背景2 割裂3 感触总结 数据库管理-第246期 为啥有些老板瞧不上技术(202401002) 作者:胖头鱼的鱼缸(尹海文&#xff09…

leetcode:380. O(1) 时间插入、删除和获取随机元素

实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。bool remove(int val) 当元素 val 存在时&#xff0…

数据仓库简介(一)

数据仓库概述 1. 什么是数据仓库? 数据仓库(Data Warehouse,简称 DW)是由 Bill Inmon 于 1990 年提出的一种用于数据分析和挖掘的系统。它的主要目标是通过分析和挖掘数据,为不同层级的决策提供支持,构成…

计算机毕业设计 基于Python的广东旅游数据分析系统的设计与实现 Python+Django+Vue Python爬虫 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

Android AMS介绍

注:本文为作者学习笔记,如有误,请各位大佬指点 系统进程运行环境的初始化 Context是一个抽象类,它可以访问application环境的全局信息和各种资源信息和类 context功能: 对Activity、Service生命周期的管理通过Intent发…

LabVIEW自动生成NI-DAQmx代码

在现代数据采集和控制系统中,LabVIEW被广泛应用于各种工业和科研领域。其中,NI-DAQmx是一个强大的驱动程序,可以帮助用户高效地管理和配置数据采集任务。本文将介绍如何在LabVIEW中通过DAQ Assistant Express VI和任务常量自动生成NI-DAQmx代…

Python编码系列—Python状态模式:轻松管理对象状态的变化

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

架构演化--将MVC代码重构成DDD

什么是好的代码架构 在当前的工作中我们所面临的主要矛盾是“越来越多的多场景化复杂业务需求与有限的研发人力之间的矛盾”。而要解决这一矛盾,就要求我们的系统能做到:设计易拓展、代码易复用、逻辑易传承、运行更稳定。 设计易拓展 一个好的架构应该…

Ceph RocksDB 深度调优

介绍 调优 Ceph 可能是一项艰巨的挑战。在 Ceph、RocksDB 和 Linux 内核之间,实际上有数以千计的选项可以进行调整以提高存储性能和效率。由于涉及的复杂性,比较优的配置通常分散在博客文章或邮件列表中,但是往往都没有说明这些设置的实际作…

如果您忘记了 Apple ID 和密码,按照指南可重新进入您的设备

即使您的 iPhone 或 iPad 由于各种原因被锁定或禁用,也可以使用 iTunes、“查找我的”、Apple 支持和 iCloud 解锁您的设备。但是,此过程需要您的 Apple ID 和密码来验证所有权并移除激活锁。如果您忘记了 Apple ID 和密码,请按照我们的指南重…

G502 鼠标自定义(配合 karabiner)

朋友送了我一个 G502 多功能鼠标,除了鼠标正常的左键、右键和滑轮外,额外提供了 6 个按键,并且滑轮可以向左、向右、向下按下,共计 9 个自定义的按键。 虽然是 karabiner 的老用户,但一直在使用 TrackPad,所…

SpringGateway(网关)微服务

一.启动nacos 1.查看linux的nacos是否启动 docker ps2.查看是否安装了nacos 前面是你的版本,后面的names是你自己的,我们下面要启动的就是这里的名字。 docker ps -a3.启动nacos并查看是否启动成功 二.创建网关项目 1.创建idea的maven项目 2.向pom.x…

VMware 虚拟机 下载安装 Centos7 和Windows10 镜像源

准备工作 下载 VMware链接:稍后发布链接 Centos7完整版链接:https://www.123865.com/ps/EF7OTd-mdAnH Centos7mini版链接:https://www.123865.com/ps/EF7OTd-1dAnH Windows10链接:https://www.123865.com/ps/EF7OTd-4dAnH 演示环境…

【Git】一文看懂Git

Git 一、简介1. Git 与 SVN 区别1.1 Git 是分布式的,SVN 不是1.1.1 分布式版本控制系统Git1.1.2 集中式版本控制系统SVN 1.2 Git 把内容按元数据方式存储,而 SVN 是按文件1.3 Git 分支和 SVN 的分支不同1.4 Git 没有一个全局的版本号,而 SVN …