You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何VibrationEffect仅在三星设备上无法生效?

三星设备振动失效的适配方案

你的代码在三星设备上失效主要有两个核心问题:参数错误和权限遗漏,以下是具体修复方案:

1. 修正振动强度参数错误

你在Android O到Q版本区间使用的VibrationEffect.CONTENTS_FILE_DESCRIPTOR是用于关联音频文件描述符的常量,不是合法的振动强度参数。三星设备对这个参数的校验更严格,传入非法值会直接忽略振动请求。

将这部分代码替换为使用系统默认强度或合法的振幅值(范围0-255,0为无振动,255为最强):

public static void vibrate(Context context) {
    if (context != null) {
        if (SPUtils.getInstance().getBoolean("isVibrationOn", true)) {
            Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
            if (vibrator.hasVibrator()) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                        VibrationEffect vibrationEffect = VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK);
                        vibrator.vibrate(vibrationEffect);
                    } else {
                        // 使用系统默认强度,替换原非法参数
                        VibrationEffect vibrationEffect = VibrationEffect.createOneShot(15, VibrationEffect.DEFAULT_AMPLITUDE);
                        vibrator.vibrate(vibrationEffect);
                    }
                } else {
                    vibrator.vibrate(15);
                }
            }
        }
    }
}

2. 确认权限声明

尽管Android 8.0(API 26)及以上版本中VIBRATE是普通权限无需动态申请,但部分三星旧设备(如A20,基于Android 10)仍需要在AndroidManifest.xml中显式声明权限:

<uses-permission android:name="android.permission.VIBRATE" />

3. 额外注意事项

  • 三星设备的系统设置可能覆盖应用振动:用户可能在「设置-声音和振动-触摸振动」中关闭了全局振动反馈,此时即使代码正确,也无法触发振动。可以在应用内增加提示引导用户检查该设置。
  • 避免使用过短的振动时长:15ms的振动在部分三星设备上可能因硬件响应阈值问题无法感知,可尝试调整为20-30ms。

内容的提问来源于stack exchange,提问作者user7954210

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:16:10