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

Android如何检测振动器类型/品质并禁用低体验振动?

解决方案

1. 基于系统属性的振动器类型检测(无需权限)

多数主流厂商会在系统属性中标记振动器类型,可通过读取该属性快速判断:

String vibratorType = System.getProperty("ro.vibrator.type");
boolean isLinearMotor = "linear".equals(vibratorType);

返回linear即为线性共振马达(RCT),返回erm或其他值则是偏心旋转质量(ERM)马达。该方法无需权限,适配小米、华为、三星等多数主流品牌,仅部分小众设备可能未配置此属性。

2. 结合API版本与权限的精准检测

若需要更高可靠性,可结合权限与系统API做二次验证:

if (ContextCompat.checkSelfPermission(context, Manifest.permission.VIBRATE) == PackageManager.PERMISSION_GRANTED) {
    Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
    // 检测是否支持高精度触摸反馈效果
    boolean supportsPreciseEffects = vibrator.hasVibrator() 
            && vibrator.areEffectsSupported(VibrationEffect.EFFECT_CLICK);
    
    // API 31+ 可通过振动属性进一步验证
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        VibrationAttributes attrs = vibrator.getVibrationAttributes();
        supportsPreciseEffects = supportsPreciseEffects 
                && attrs.getUsage() == VibrationAttributes.USAGE_TOUCH;
    }
    
    // 不支持高精度效果则禁用振动
    if (!supportsPreciseEffects) {
        disableHaptics();
    }
} else {
    // 无振动权限时默认禁用,避免触发权限申请弹窗
    disableHaptics();
}

3. 封装统一的触觉反馈调用

将检测逻辑封装到工具方法中,统一管理所有触觉反馈触发:

public static void performSafeHapticFeedback(View view, int feedbackConstant) {
    if (shouldDisableHaptics(view.getContext())) {
        return;
    }
    view.performHapticFeedback(feedbackConstant);
}

private static boolean shouldDisableHaptics(Context context) {
    // 优先通过系统属性判断
    String vibratorType = System.getProperty("ro.vibrator.type");
    if ("erm".equals(vibratorType)) {
        return true;
    }
    // 老旧设备(API < 23)直接禁用
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        return true;
    }
    // 无权限或不支持高精度效果时禁用
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.VIBRATE) != PackageManager.PERMISSION_GRANTED) {
        return true;
    }
    Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
    return !vibrator.areEffectsSupported(VibrationEffect.EFFECT_CLICK);
}

4. 补充方案:用户手动开关

若自动检测仍存在误差,可在应用设置中添加「触觉反馈开关」,让用户自行选择是否开启,作为兜底方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:55:17