最近接到的任务:实现手机键盘按键音功能
可是网上查到的资料太少,可能是现在没什么带键盘的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 系统按键音相关推荐

  1. android 系统按键音framework流程源码解析

    android 系统按键音framework源码解析(基于android 9.0) 今天来看下android中按键音的处理,首先看下按键是在那里开启的.然后再看看当按下按键后一个按键音是怎么播放出来的 ...

  2. android 唱歌评分系统,抖音上唱歌评分的软件叫什么 可以评分的唱歌软件推荐

    抖音作为当前最火热的短视频平台,不但带来了一首首魔性的神曲舞蹈,还带火了大量的商品.今天要给大家介绍的就是抖音上唱歌评分的软件,以及推荐两个可以评分的唱歌软件给大家. 首先我们要知道抖音上唱歌评分的软 ...

  3. Android 直接播放系统提示音

    Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); Ringtone rt = RingtoneMa ...

  4. android+touch声音大小,Android 获取/设置按键音(Touch Sounds)

    参考类: Settings.System 系统按键音获取: Settings.System.getInt(getContentResolver(), Settings.System.SOUND_EFF ...

  5. Android按键音无效

    今天遇到Android系统按键音的问题.在Android TV中,可以通过设置-声音-按键音来设置按键音开或者关.当打开按键音时,在Android TV的各个场景中通过遥控器操作上下左右键的时候都会有 ...

  6. Android 修改按键音

    一.按键音调用流程 摘要:按键音播放的总体逻辑是先找到系统中按键音的资源,然后调用SoundPool.load让系统加载音频资源,加载成功后在onLoadComplete回调中会返回一个非0的soun ...

  7. Android按键音

    按键音处理流程 View层发起 AudioService 按键音是用户按下后抬起时发出的声音,可在手机系统设置打开或者关闭. 代码分析基于 API 33 View层发起 逻辑在事件分发机制的onTou ...

  8. Android 默认按键音开关

    android 默认按键音开关的值存储位置在 frameworks/base/packages/SettingsProvider/res/values/defaults.xml , <!-- D ...

  9. Android P 按键音分析

    按键音分析 触摸按键音流程 第一部分 第二部分 AudioService.java 物理按键音流程 触摸按键音流程 前面简要的流程我们就不分析了,画了一下简要的流程图,由于我分析的源码具有特殊性,分为 ...

最新文章

  1. 开发脚本自动部署及监控
  2. Nginx(二)------nginx.conf 配置文件
  3. boost::signals2模块实现为类定义预析构函数的最小示例的测试程序
  4. [译]如何在visual studio中调试Javascript
  5. 十问十答 Ms-PL 许可证
  6. 除了 Tensorflow、PyTorch ,还有哪些深度学习框架值得期待?
  7. diff 命令用法--如何打补丁【原创--学习笔记】
  8. ASP.NET C# 实现钉钉签名算法
  9. Kotlin Compose 标准组件
  10. Windows系统连接Linux的常用网管工具下载
  11. 【Ubuntu】常用Vim插件
  12. 志愿者招募| WasmEdge 邀你参加第七届中国开源年会 COSCon 2022
  13. 零基础学kubernetes(k8s)必看教程,带你10分钟快速实战入门k8s
  14. OpenGL核心技术之Gamma校正
  15. 中专计算机专业execl教案,计算机专项目化教案(EXCEL教案
  16. 网络安全漏洞管理十大度量指标
  17. 微博实时号权重是什么,如何养成高权重高的号
  18. 用python打印几种三角形的排列
  19. mplayer 播放电台_通过SSH的MPlayer从远程主机播放电影
  20. BIOS学习:BIOS设置图解教程

热门文章

  1. Sallen-Key二阶低通滤波器——设计问题浅析
  2. 使用海康摄像头保存的mp4文件,无法web端预览的问题,现已解决,记录一下
  3. Java8 List removeIf用法技巧
  4. 开发 Windows RT 桌面应用(来自 Surface RT)
  5. 戴尔Precision 7540 Compal EDA50 LA-H271P Rev1.0(A00)笔记本图纸
  6. 硬盘构造及其工作原理
  7. 周跃计算机四级讲义,全国计算机等级考试《信息安全工程师(四级)》复习全书【核心讲义+历年真题详解】.pdf...
  8. ABAP 程序完成EXCEL文件的导入导出,OLE技术的应用
  9. [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)
  10. 山东省高新技术企业培育入库申报材料