Android:如何让振动在「仅振动」模式下正常工作?
Android 仅振动模式下振动功能失效的解决方案
问题场景
在Android(API 34,Android 11)应用中使用以下代码实现振动功能:
Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); long[] pattern = {0, 500, 500}; v.vibrate(VibrationEffect.createWaveform(pattern, 0));
设备处于「正常」模式时振动可正常运行,但切换至「仅振动」模式后,振动功能失效。
核心原因
仅振动模式下,系统会拦截未明确用途的振动请求;原代码未配置振动用途属性,导致系统判定该振动不符合模式规则。
解决方案
1. 确认权限配置
在AndroidManifest.xml中添加振动权限(普通权限,安装自动授予):
<uses-permission android:name="android.permission.VIBRATE" />
2. 配置AudioAttributes指定振动用途
针对API 26+,通过AudioAttributes明确振动的用途类型,让系统认可该振动在仅振动模式下的合法性:
Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); if (v.hasVibrator()) { // 根据场景选择用途:如通知用USAGE_NOTIFICATION_EVENT,闹钟用USAGE_ALARM AudioAttributes attrs = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_NOTIFICATION_EVENT) .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .build(); long[] pattern = {0, 500, 500}; VibrationEffect effect = VibrationEffect.createWaveform(pattern, 0); v.vibrate(effect, attrs); }
3. API版本适配
API 31+部分vibrate重载已废弃,必须使用带AudioAttributes的调用方式,避免兼容性问题。
4. 检查系统振动设置
确认设备「仅振动」模式下的振动强度未设为0:进入系统设置→声音和振动→振动强度,确保通知、媒体等相关振动强度正常。
内容的提问来源于stack exchange,提问作者Binyamin Pekar
相关产品推荐
相关产品推荐

