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

发布于:2024-04-29 ⋅ 阅读:(30) ⋅ 点赞:(0)

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

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

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

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

二、 适配按键事件

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

system/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
	@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即可生效。

vendor/vendor/mediatek/proprietary/hardware/libvibrator/aidl/default/Vibrator.cpp
// 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;
慢也好,步伐小也罢,是往前走就好。

网站公告

今日签到

点亮在社区的每一天
去签到