Android 8.1 系统按键音
最近接到的任务:实现手机键盘按键音功能
可是网上查到的资料太少,可能是现在没什么带键盘的Android设备了
一开始我以为系统会做好这些东西,是需要找到一个开关,写一个默认值就行,然鹅事情并没有这么简单,分析源码好像只找到锁屏按键、屏幕点击的点击音。。。只能自己写这功能了!
话不多说,开始分析按键流程
具体的流程网上的资源特别多,就不在此一一赘述了。
流程涉及的主要方法和类:
DecorView -> dispatchKeyEvent()
Activity -> dispatchKeyEvent()
ViewGroup -> dispatchKeyEvent()
View -> dispatchKeyEvent()
KeyEvent -> dispatch()
View -> onKeyDown/Up()
事件会在上述流程中传递,那么我们想要发出按键音,只需要在上述流程中找到一个合适的地方,播放音量资源。
那什么是,合适的地方呢,我的第一要素是参照系统自带的功能设计。
那我就在上述涉及到的类里开始寻找。
1、分析锁屏音,能不能仿造
经过对锁屏键的跟踪,发现它的音量播放不在按键流程里,而是在锁屏流程里,而我们要避免过于复杂的流程,所以先暂时排除。
2、分析触摸提示音、能不能仿造
那就跟踪view的touch dispatch看看吧
发现目标
playSoundEffect(SoundEffectConstants.CLICK)
frameworks/base/core/java/android/view/View.java
按键音在View.java里实现了,用的playSoundEffect()这个方法,那我们就也用这个方法来实现我们的按键音吧
View ----> dispatchKeyEvent()
按键会在view的dispatchKeyEvent进行分发处理,那么我们就在这个函数里对键值进行判断吧:
public boolean dispatchKeyEvent(KeyEvent event) {final int keyCode = event.getKeyCode();if (event.getAction() != KeyEvent.ACTION_DOWN) {
switch (keyCode) {case KeyEvent.KEYCODE_BACK:case KeyEvent.KEYCODE_MENU:case KeyEvent.KEYCODE_WAKEUP:case KeyEvent.KEYCODE_PAIRING:case KeyEvent.KEYCODE_STEM_1:case KeyEvent.KEYCODE_STEM_2:case KeyEvent.KEYCODE_STEM_3:case KeyEvent.KEYCODE_0:case KeyEvent.KEYCODE_1:case KeyEvent.KEYCODE_2:case KeyEvent.KEYCODE_3:case KeyEvent.KEYCODE_4:case KeyEvent.KEYCODE_5:case KeyEvent.KEYCODE_6:case KeyEvent.KEYCODE_7:case KeyEvent.KEYCODE_8:case KeyEvent.KEYCODE_9:case KeyEvent.KEYCODE_STAR:case KeyEvent.KEYCODE_POUND:case KeyEvent.KEYCODE_ENTER:case KeyEvent.KEYCODE_DEL:case KeyEvent.KEYCODE_CAPS_LOCK:case KeyEvent.KEYCODE_SCROLL_LOCK:case KeyEvent.KEYCODE_FUNCTION:case KeyEvent.KEYCODE_F7: {playSoundEffect(5); }}}
OK!编译好push到手机里就实现了,按下按键就有像点击屏幕一样的“突突突”音了。。。
好,现在来分析playSoundEffect(SoundEffectConstants.CLICK)
这个参数就是播放音效的关键了,那就来分析 SoundEffectConstants
这里面就定义了点击、上、下、左、右的5种音效
public static final int CLICK = 0;public static final int NAVIGATION_LEFT = 1;public static final int NAVIGATION_UP = 2;public static final int NAVIGATION_RIGHT = 3;public static final int NAVIGATION_DOWN = 4;public static final int NAVIGATION_KEYPRESS = 5;//add keypress effect
playSoundEffect函数才是真正的播放的关键地方,跟进
frameworks\base\core\java\android\view\ViewRootImpl.java
@Overridepublic void playSoundEffect(int effectId) {checkThread();try {final AudioManager audioManager = getAudioManager();switch (effectId) {case SoundEffectConstants.CLICK:audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);return;case SoundEffectConstants.NAVIGATION_DOWN:audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN);return;case SoundEffectConstants.NAVIGATION_LEFT:audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT);return;case SoundEffectConstants.NAVIGATION_RIGHT:audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT);return;case SoundEffectConstants.NAVIGATION_UP:audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP);return;case SoundEffectConstants.NAVIGATION_KEYPRESS:audioManager.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);return;.........
case SoundEffectConstants.NAVIGATION_KEYPRESS:
audioManager.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);
return;
这段就是我增加的音效,之所以是AudioManager.FX_KEYPRESS_STANDARD,
这就是我在跟AudioManager.FX_KEY_CLICK的时候在AudioManager里面发现的系统有对按键音原来有过分配音效,可能是因为键盘逐渐弃用,而对按键音不再适配了吧。
好,到此为止,按键音功能已经实现,本文到此为止,但是后续的拓展的东西还很多,比如AudioManager里面去实现自定义的音乐资源作为提示音,以及这样实现会不会带来不好的影响我也没有深入研究,作为新人,希望记录下来自己的工作,如有错误的地方希望大家指正!
谢谢!
Android 8.1 系统按键音相关推荐
- android 系统按键音framework流程源码解析
android 系统按键音framework源码解析(基于android 9.0) 今天来看下android中按键音的处理,首先看下按键是在那里开启的.然后再看看当按下按键后一个按键音是怎么播放出来的 ...
- android 唱歌评分系统,抖音上唱歌评分的软件叫什么 可以评分的唱歌软件推荐
抖音作为当前最火热的短视频平台,不但带来了一首首魔性的神曲舞蹈,还带火了大量的商品.今天要给大家介绍的就是抖音上唱歌评分的软件,以及推荐两个可以评分的唱歌软件给大家. 首先我们要知道抖音上唱歌评分的软 ...
- Android 直接播放系统提示音
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); Ringtone rt = RingtoneMa ...
- android+touch声音大小,Android 获取/设置按键音(Touch Sounds)
参考类: Settings.System 系统按键音获取: Settings.System.getInt(getContentResolver(), Settings.System.SOUND_EFF ...
- Android按键音无效
今天遇到Android系统按键音的问题.在Android TV中,可以通过设置-声音-按键音来设置按键音开或者关.当打开按键音时,在Android TV的各个场景中通过遥控器操作上下左右键的时候都会有 ...
- Android 修改按键音
一.按键音调用流程 摘要:按键音播放的总体逻辑是先找到系统中按键音的资源,然后调用SoundPool.load让系统加载音频资源,加载成功后在onLoadComplete回调中会返回一个非0的soun ...
- Android按键音
按键音处理流程 View层发起 AudioService 按键音是用户按下后抬起时发出的声音,可在手机系统设置打开或者关闭. 代码分析基于 API 33 View层发起 逻辑在事件分发机制的onTou ...
- Android 默认按键音开关
android 默认按键音开关的值存储位置在 frameworks/base/packages/SettingsProvider/res/values/defaults.xml , <!-- D ...
- Android P 按键音分析
按键音分析 触摸按键音流程 第一部分 第二部分 AudioService.java 物理按键音流程 触摸按键音流程 前面简要的流程我们就不分析了,画了一下简要的流程图,由于我分析的源码具有特殊性,分为 ...
最新文章
- 开发脚本自动部署及监控
- Nginx(二)------nginx.conf 配置文件
- boost::signals2模块实现为类定义预析构函数的最小示例的测试程序
- [译]如何在visual studio中调试Javascript
- 十问十答 Ms-PL 许可证
- 除了 Tensorflow、PyTorch ,还有哪些深度学习框架值得期待?
- diff 命令用法--如何打补丁【原创--学习笔记】
- ASP.NET C# 实现钉钉签名算法
- Kotlin Compose 标准组件
- Windows系统连接Linux的常用网管工具下载
- 【Ubuntu】常用Vim插件
- 志愿者招募| WasmEdge 邀你参加第七届中国开源年会 COSCon 2022
- 零基础学kubernetes(k8s)必看教程,带你10分钟快速实战入门k8s
- OpenGL核心技术之Gamma校正
- 中专计算机专业execl教案,计算机专项目化教案(EXCEL教案
- 网络安全漏洞管理十大度量指标
- 微博实时号权重是什么,如何养成高权重高的号
- 用python打印几种三角形的排列
- mplayer 播放电台_通过SSH的MPlayer从远程主机播放电影
- BIOS学习:BIOS设置图解教程
热门文章
- Sallen-Key二阶低通滤波器——设计问题浅析
- 使用海康摄像头保存的mp4文件,无法web端预览的问题,现已解决,记录一下
- Java8 List removeIf用法技巧
- 开发 Windows RT 桌面应用(来自 Surface RT)
- 戴尔Precision 7540 Compal EDA50 LA-H271P Rev1.0(A00)笔记本图纸
- 硬盘构造及其工作原理
- 周跃计算机四级讲义,全国计算机等级考试《信息安全工程师(四级)》复习全书【核心讲义+历年真题详解】.pdf...
- ABAP 程序完成EXCEL文件的导入导出,OLE技术的应用
- [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)
- 山东省高新技术企业培育入库申报材料