使用Vibrator模块intensity参数调节振幅
===========================

#### 问题现象

如何实现设备在不同场景下设置不同的振动效果？例如：设备的按键可以设置不同强度和不同时长的振动。

#### 背景知识

当设备需要设置不同的振动效果时，可以调用[@ohos.vibrator](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-vibrator)的[VibratePreset](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-vibrator#vibratepreset9)模块，设置振动强度参数intensity调节振幅，详情可参考[振动开发指导](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/vibrator-guidelines)。

系统支持两种方式调节振动强度：

*   通过VibratePreset接口的intensity参数在0-100范围内进行振动强度调节，详情可参考[VibratePreset](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-vibrator#vibratepreset9)的intensity参数，但是仅支持部分设备，可通过[isHdHapticSupported](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-vibrator#vibratorishdhapticsupported12)接口判断设备是否支持高清振动。
*   若不支持高清振动可通过系统已预置简单而通用的振动效果进行三档调节，详情可参考[hapticfeedback](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-vibrator#hapticfeedback12)。

#### 解决方案

控制设备上的振动器，需要先申请权限[ohos.permission.VIBRATE](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/permissions-for-all#ohospermissionvibrate)，具体配置方式请参考[声明权限](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/declare-permissions)。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/05/v3/e9v5H9WvSXSoUo0vqD333A/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260709T134229Z&HW-CC-Expire=86400&HW-CC-Sign=68FA5669FF416C9DE321A1F8426B6B4D82B160C46EDB62D042759D63E5E6D54D)

Usage振动使用场景类型为默认“unknown”时，受系统触感开关管控，关闭时不振动。

可通过如下方案设置振幅，示例代码如下：

import { vibrator } from '@kit.SensorServiceKit';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct VibratorDemo {
  build() {
    Column() {
      Button('振动')
        .onClick(() => {
          try {
            let ret = vibrator.isHdHapticSupported();
            console.info(\`isHdHapticSupported result is ${ret}\`);
            if (ret) {
             _ // 需要在module.json5中添加权限"ohos.permission.VIBRATE"_
              vibrator.startVibration({
                type: 'preset',
                count: 20,
                intensity: 100,
                effectId: 'haptic.effect.hard',
              }, {
               _ // 可定义振动使用场景_
                usage: 'unknown'
              }, (error: BusinessError) => {
                if (error) {
                  console.error(\`Failed to start vibration. Code: ${error.code}, message: ${error.message}\`);
                  return;
                }
                console.info('Succeed in starting vibration');
              });
            } else {
              vibrator.startVibration({
                type: 'preset',
                effectId: 'haptic.effect.soft',
                count: 1,
              }, {
                usage: 'unknown'
              }).then(() => {
                console.info('Succeed in starting vibration');
              }).catch((error: BusinessError) => {
                console.error(\`Failed to start vibration. Code: ${error.code}, message: ${error.message}\`);
              });
            }
          } catch (err) {
            let e: BusinessError = err as BusinessError;
            console.error(\`An unexpected error occurred. Code: ${e.code}, message: ${e.message}\`);
          }
        });
    }
    .justifyContent(FlexAlign.Center)
    .width('100%').height('100%');
  }
}