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

如何向设备发送振动?批量发送及部分设备失效问题求解

设备振动实现、批量振动方案及故障排查

单个设备振动实现

根据你使用的平台/引擎,实现方式有所不同:

Android 原生开发

  • 先在AndroidManifest.xml中添加振动权限:
    <uses-permission android:name="android.permission.VIBRATE" />
    
  • 代码实现:
    // Android 12+ (API >=31)
    VibrationManager vibrationManager = getSystemService(VibrationManager.class);
    VibrationEffect effect = VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE);
    vibrationManager.vibrate(effect);
    
    // Android 11及以下 (API <31)
    Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    if (vibrator != null && vibrator.hasVibrator()) {
        vibrator.vibrate(500); // 振动持续500毫秒
    }
    

iOS 原生开发

  • 简单振动(适配大部分设备):
    import UIKit
    
    let feedbackGenerator = UIImpactFeedbackGenerator(style: .medium)
    feedbackGenerator.prepare() // 提前准备提升响应速度
    feedbackGenerator.impactOccurred()
    
  • 自定义触觉振动(需iOS 13+,支持CoreHaptics的设备):
    import CoreHaptics
    
    var hapticEngine: CHHapticEngine?
    
    func triggerCustomVibration() {
        guard CHHapticEngine.capabilitiesForHardware().supportsHaptics else { return }
        do {
            hapticEngine = try CHHapticEngine()
            try hapticEngine?.start()
            
            let vibrationEvent = CHHapticEvent(eventType: .hapticTransient,
                                               parameters: [
                                                    CHHapticEventParameter(parameterID: .hapticIntensity, value: 1.0),
                                                    CHHapticEventParameter(parameterID: .hapticSharpness, value: 0.6)
                                                ],
                                               relativeTime: 0)
            let pattern = try CHHapticPattern(events: [vibrationEvent], parameters: [])
            let player = try hapticEngine?.makePlayer(with: pattern)
            try player?.start(atTime: CHHapticTimeImmediate)
        } catch {
            print("振动失败: \(error.localizedDescription)")
        }
    }
    

Unity 游戏开发

  • 基础振动:
    // 触发一次短振动
    Handheld.Vibrate();
    
  • 自定义手柄振动(适配新Input System):
    using UnityEngine.InputSystem;
    
    public void TriggerGamepadVibration(float duration = 0.5f) {
        var gamepad = Gamepad.current;
        if (gamepad == null) return;
        
        // 设置左右马达强度(0-1)
        gamepad.SetMotorSpeeds(0.7f, 0.7f);
        // 延迟停止振动
        Invoke(nameof(StopGamepadVibration), duration);
    }
    
    void StopGamepadVibration() {
        var gamepad = Gamepad.current;
        if (gamepad != null) gamepad.SetMotorSpeeds(0, 0);
    }
    

批量发送振动的方法

批量振动没有通用的系统级API,需根据场景实现:

游戏服务器场景

通过服务器向所有在线客户端推送振动指令,客户端收到后触发本地振动逻辑。以Unity为例:

// 服务器端(需使用Unity Netcode for GameObjects)
[ServerRpc(RequireOwnership = false)]
public void BroadcastVibrationServerRpc() {
    // 向所有客户端广播振动指令
    TriggerVibrationClientRpc();
}

[ClientRpc]
void TriggerVibrationClientRpc() {
    // 客户端执行振动
    Handheld.Vibrate();
}

蓝牙外设场景

如果是管理多个蓝牙连接的设备(如游戏手柄),可通过BLE GATT服务向每个设备发送振动指令,或通过蓝牙广播批量下发命令(需设备支持批量指令)。

企业设备管理场景

需通过MDM(移动设备管理)工具,向受控设备推送自定义脚本,触发振动逻辑(仅适用于企业级受控设备)。

部分设备振动不生效的排查点

  • 权限缺失:Android需确保VIBRATE权限已申请并授予;
  • 系统设置:用户可能关闭了设备振动(如静音模式下禁用振动、系统触觉反馈开关关闭);
  • 硬件限制:部分低端设备无振动马达,或马达硬件损坏;
  • API版本兼容:Android 12+必须使用VibrationManager,旧VibratorAPI可能失效;iOS需注意设备是否支持对应触觉API(如老设备不支持CoreHaptics);
  • 引擎配置问题:Unity需在Player Settings中勾选Android振动权限、开启iOS Haptics选项;
  • 后台限制:部分系统对后台应用的振动操作有限制,需确保应用在前台或拥有后台权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:37:40