Android 振动和触感反馈功能失效问题分析

本文最后更新于:2024年5月31日 下午

  在Android13的项目(MTK平台)中遇到这样一个问题,在设置 - 提示音和振动 - 振动和触感反馈 - 打开按触反馈,但是按键没有振动的效果(一般来说也就是三个导航按键的振动反馈)

一、 可以先通过adb来确定是否有打印Log,查看中相关的按键振动事件是否有效

  这里Log打印的振动时长,其实是WAVEFORM_CLICK_EFFECT的值(在本文章的第三点)

1
2
adb shell logcat | findstr "timeoutMs"
04-28 13:41:23.515 697 697 I Vibrator: Vibrator on for timeoutMs: 20

二、 适配按键事件

  如果没有相关Log打印,则在PhoneWindowManager中根本就没有对应按键的振动事件,则需要将对应的按键进行如下配置

1
system/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
......

// Enable haptics if down and virtual key without multiple repetitions. If this is a hard
// virtual key such as a navigation bar button, only vibrate if flag is enabled.
final boolean isNavBarVirtKey = ((event.getFlags() & KeyEvent.FLAG_VIRTUAL_HARD_KEY) != 0);
boolean useHapticFeedback = down
&& (policyFlags & WindowManagerPolicy.FLAG_VIRTUAL) != 0
&& (!isNavBarVirtKey || mNavBarVirtualKeyHapticFeedbackEnabled)
&& event.getRepeatCount() == 0;

// press and touch feedback of navigation keys begin
Log.d(TAG, "keying vibration 1 = " + keyCode);
if (keyCode == KeyEvent.KEYCODE_HOME || keyCode == KeyEvent.KEYCODE_BACK
|| keyCode == KeyEvent.KEYCODE_APP_SWITCH {
if (down && event.getRepeatCount() == 0) {
useHapticFeedback = true;
Log.d(TAG, "keying vibration 2 = " + keyCode);
}
}
// press and touch feedback of navigation keys end

......

三、延长振动时长

  如果Log中打印振动时常为20毫秒的话,亲测是没有任何振动触感的,所以我们延长振动的时间(单位为毫秒),具体的值要根据自己的需求来修改(本人项目最后修改的是80毫秒),当时我的项目只需要修改WAVEFORM_CLICK_EFFECT = 80即可生效。

1
vendor/vendor/mediatek/proprietary/hardware/libvibrator/aidl/default/Vibrator.cpp
1
2
3
4
5
6
7
8
9
10
11
// Use effect #1 in the waveform library for CLICK effect
static constexpr int32_t WAVEFORM_CLICK_EFFECT = 80;

// Use effect #2 in the waveform library for TICK effect
static constexpr int32_t WAVEFORM_TICK_EFFECT = 50;

// Use effect #3 in the waveform library for DOUBLE_CLICK effect
static constexpr int32_t WAVEFORM_DOUBLE_CLICK_EFFECT = 70;

// Use effect #4 in the waveform library for HEAVY_CLICK effect
static constexpr int32_t WAVEFORM_HEAVY_CLICK_EFFECT = 90;
慢也好,步伐小也罢,是往前走就好。

Android 振动和触感反馈功能失效问题分析
http://example.com/2024/04/28/Android 振动和触感反馈功能失效问题分析/
作者
阿波~
发布于
2024年4月28日
更新于
2024年5月31日
许可协议