vibrator-guidelines.md 10.7 KB
Newer Older
H
update  
HelloCrease 已提交
1 2 3 4 5 6
# Vibrator开发指导


## 场景介绍

当设备需要设置不同的振动效果时,可以调用Vibrator模块,例如:设备的按键可以设置不同强度和不同时长的振动,闹钟和来电可以设置不同强度和时长的单次或周期振动。
7

8
详细的接口介绍请参考[Vibrator接口](../reference/apis/js-apis-vibrator.md)
H
update  
HelloCrease 已提交
9 10 11 12


## 接口说明

C
cff-gite 已提交
13 14 15 16 17 18
| 模块          | 接口名                                                       | 描述                                                         |
| ------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| ohos.vibrator | startVibration(effect: VibrateEffect, attribute: VibrateAttribute): Promise<void> | 根据指定振动效果和振动属性触发马达振动,使用Promise异步回调。 |
| ohos.vibrator | startVibration(effect: VibrateEffect, attribute: VibrateAttribute, callback: AsyncCallback<void>): void | 根据指定振动效果和振动属性触发马达振动,使用Callback异步回调。 |
| ohos.vibrator | stopVibration(stopMode: VibratorStopMode): Promise<void> | 按照指定模式停止马达的振动。                                 |
| ohos.vibrator | stopVibration(stopMode: VibratorStopMode, callback: AsyncCallback<void>): void | 按照指定模式停止马达的振动。                                 |
19
| ohos.vibrator | stopVibration(): Promise<void>                         | 停止所有模式的马达振动。                                     |
20
| ohos.vibrator | stopVibration(callback: AsyncCallback<void>): void     | 停止所有模式的马达振动。                                     |
21
| ohos.vibrator | isSupportEffect(effectId: string): Promise<boolean>    | 查询是否支持传入的参数effectId。返回true则表示支持,否则不支持 |
22
| ohos.vibrator | isSupportEffect(effectId: string, callback: AsyncCallback<boolean>): void | 查询是否支持传入的参数effectId。返回true则表示支持,否则不支持 |
H
update  
HelloCrease 已提交
23

L
lixiangpeng5 已提交
24 25 26 27 28

## 自定义振动格式

自定义振动提供给用户设计自己所需振动效果的能力,用户可通过自定义振动配置文件,并遵循相应规则编排所需振动形式,使能更加开放的振感交互体验。

29 30
自定义振动配置文件为Json格式,在形式上如下所示:

L
lixiangpeng5 已提交
31
```json
L
lixiangpeng5 已提交
32
{
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
    "MetaData": {
        "Create": "2023-01-09",
        "Description": "a haptic case",
        "Version": 1.0,
        "ChannelNumber": 1
    },
    "Channels": [
        {
            "Parameters": {
                "Index": 1
            },
            "Pattern": [
                {
                    "Event": {
                        "Type": "transient",
                        "StartTime": 0,
                        "Parameters": {
                            "Intensity": 100,
                            "Frequency": 31
                        }
                    }
                },
                {
                    "Event": {
                        "Type": "continuous",
                        "StartTime": 100,
                        "Duration": 54,
                        "Parameters": {
                            "Intensity": 38,
                            "Frequency": 30
                        }
                    }
                }
            ]
        }
    ]
L
lixiangpeng5 已提交
69 70
}
```
71

L
lixiangpeng5 已提交
72 73 74 75 76 77 78
Json文件共包含2个属性。
- "MetaData"属性中为文件头信息,可在如下属性中添加描述。<br>
"Version":必填项,文件格式的版本号,向前兼容,目前起步仅支持版本1.0;<br>
"ChannelNumber":必填项,表示马达振动的通道数,目前仅支持单通道,规定为1;<br>
"Create":可选项,可记录文件创作时间;<br>
"Description":可选项,可指明振动效果、创建信息等附加说明。<br>
- "Channels"属性中为马达振动通道的相关信息。<br>
79

L
lixiangpeng5 已提交
80
"Channels"是Json数组,表示各个通道的信息,包含2个属性。
L
lixiangpeng5 已提交
81 82
- "Parameters"属性中为通道参数。<br>
"Index":必填项,表示通道编号,单通道下规定为1。<br>
L
lixiangpeng5 已提交
83
- "Pattern"属性中为马达振动序列。<br>
84

L
lixiangpeng5 已提交
85
"Pattern"是Json数组,每个"Event"属性代表1个振动事件,支持添加2种振动类型。
L
lixiangpeng5 已提交
86 87
- 类型1:"transient"类型,瞬态短振动,干脆有力;<br>
- 类型2:"continuous"类型,稳态长振动,具备长时间输出强劲有力振动的能力。<br>
88 89 90 91 92

振动事件参数信息具体如下表:

| 参数 | 说明 | 范围|
| --- | ------------------------ | ---|
L
lixiangpeng5 已提交
93 94 95 96 97
| Type | 振动事件类型,必填 | "transient" 或"continuous"|
| StartTime | 振动的起始时间,必填 | 单位ms,有效范围为[0, 1800 000],振动事件不能重叠|
| Duration | 振动持续时间,仅当类型为"continuous"时有效 | 单位ms,有效范围为(10, 1600)|
| Intensity | 振动强度,必填 | 有效范围为[0, 100],这里的强度值为相对值,并不代表真实强度|
| Frequency | 振动频率,必填 | 有效范围为[0, 100],这里的频率值为相对值,并不代表真实频率|
98 99 100 101 102 103 104

其他要求:

| 参数 | 要求                 |
| -------- | ------------------------ |
| 振动事件(event)的数量 | 不得超过128个 |
| 振动配置文件长度 | 不得超过64KB |
H
update  
HelloCrease 已提交
105

L
lixiangpeng5 已提交
106

H
update  
HelloCrease 已提交
107 108
## 开发步骤

H
h00514358 已提交
109
1. 控制设备上的振动器,需要申请权限ohos.permission.VIBRATE。具体配置方式请参考[权限申请声明](../security/accesstoken-guidelines.md)
H
update  
HelloCrease 已提交
110

L
li-yaoyao777 已提交
111
2. 根据指定振动效果和振动属性触发马达振动。
C
cff-gite 已提交
112

L
lixiangpeng5 已提交
113
```ts
L
lixiangpeng5 已提交
114
import vibrator from '@ohos.vibrator';
L
lixiangpeng5 已提交
115

L
lixiangpeng5 已提交
116
try {
L
lixiangpeng5 已提交
117 118 119 120 121 122 123 124 125 126 127 128 129
  vibrator.startVibration({ // 使用startVibration需要添加ohos.permission.VIBRATE权限
    type: 'time',
    duration: 1000,
  }, {
    id: 0,
    usage: 'alarm'
  }, (error) => {
    if (error) {
      console.error(`Failed to start vibration. Code: ${error.code}, message: ${error.message}`);
      return;
    }
    console.info('Succeed in starting vibration.');
  });
L
lixiangpeng5 已提交
130
} catch (err) {
L
lixiangpeng5 已提交
131
  console.error(`An unexpected error occurred. Code: ${err.code}, message: ${err.message}`);
L
lixiangpeng5 已提交
132 133
}
```
C
cff-gite 已提交
134

L
li-yaoyao777 已提交
135
3. 按照指定模式停止马达的振动。 
C
cff-gite 已提交
136

L
lixiangpeng5 已提交
137
```ts
L
lixiangpeng5 已提交
138
import vibrator from '@ohos.vibrator';
L
lixiangpeng5 已提交
139

L
lixiangpeng5 已提交
140
try {
L
lixiangpeng5 已提交
141 142 143 144 145 146 147 148
  // 按照VIBRATOR_STOP_MODE_TIME模式停止振动, 使用stopVibration需要添加ohos.permission.VIBRATE权限
  vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME, function (error) {
    if (error) {
      console.error(`Failed to stop vibration. Code: ${error.code}, message: ${error.message}`);
      return;
    }
    console.info('Succeeded in stopping vibration.');
  })
L
lixiangpeng5 已提交
149
} catch (err) {
L
lixiangpeng5 已提交
150
  console.error(`An unexpected error occurred. Code: ${err.code}, message: ${err.message}`);
L
lixiangpeng5 已提交
151 152 153
}
```

154 155
4. 停止所有模式的马达振动。

L
lixiangpeng5 已提交
156
```ts
L
lixiangpeng5 已提交
157 158 159
import vibrator from '@ohos.vibrator';
// 使用startVibration、stopVibration需要添加ohos.permission.VIBRATE权限
try {
L
lixiangpeng5 已提交
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
  vibrator.startVibration({
    type: 'time',
    duration: 1000,
  }, {
    id: 0,
    usage: 'alarm'
  }, (error) => {
    if (error) {
      console.error(`Failed to start vibration. Code: ${error.code}, message: ${error.message}`);
      return;
    }
    console.info('Succeed in starting vibration');
  });
  // 停止所有类型的马达振动
  vibrator.stopVibration(function (error) {
    if (error) {
      console.error(`Failed to stop vibration. Code: ${error.code}, message: ${error.message}`);
      return;
    }
    console.info('Succeed in stopping vibration');
  })
L
lixiangpeng5 已提交
181
} catch (error) {
L
lixiangpeng5 已提交
182
  console.error(`An unexpected error occurred. Code: ${error.code}, message: ${error.message}`);
L
lixiangpeng5 已提交
183 184
}
```
185 186 187

5. 查询是否支持传入的参数effectId。

L
lixiangpeng5 已提交
188
```ts
L
lixiangpeng5 已提交
189
import vibrator from '@ohos.vibrator';
L
lixiangpeng5 已提交
190

L
lixiangpeng5 已提交
191
try {
L
lixiangpeng5 已提交
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
  // 查询是否支持'haptic.clock.timer'
  vibrator.isSupportEffect('haptic.clock.timer', function (err, state) {
    if (err) {
      console.error(`Failed to query effect. Code: ${err.code}, message: ${err.message}`);
      return;
    }
    console.info('Succeed in querying effect');
    if (state) {
      try {
        vibrator.startVibration({ // 使用startVibration需要添加ohos.permission.VIBRATE权限
          type: 'preset',
          effectId: 'haptic.clock.timer',
          count: 1,
        }, {
          usage: 'unknown'
        }, (error) => {
          if (error) {
            console.error(`Failed to start vibration. Code: ${error.code}, message: ${error.message}`);
          } else {
            console.info('Succeed in starting vibration');
          }
        });
      } catch (error) {
        console.error(`An unexpected error occurred. Code: ${error.code}, message: ${error.message}`);
      }
    }
  })
L
lixiangpeng5 已提交
219
} catch (error) {
L
lixiangpeng5 已提交
220
  console.error(`An unexpected error occurred. Code: ${error.code}, message: ${error.message}`);
L
lixiangpeng5 已提交
221 222
}
```
223

224 225
6. 启动和停止自定义振动

L
lixiangpeng5 已提交
226
```ts
L
lixiangpeng5 已提交
227 228 229 230 231
import vibrator from '@ohos.vibrator';

const FILE_NAME = "xxx.json";

// 获取振动文件资源描述符
L
lixiangpeng5 已提交
232 233 234 235 236 237 238
let fileDescriptor = undefined;
getContext().resourceManager.getRawFd(FILE_NAME).then(value => {
  fileDescriptor = { fd: value.fd, offset: value.offset, length: value.length };
  console.info('Succeed in getting resource file descriptor');
}).catch(error => {
  console.error(`Failed to get resource file descriptor. Code: ${error.code}, message: ${error.message}`);
});
L
lixiangpeng5 已提交
239 240
// 使用startVibration、stopVibration需要添加ohos.permission.VIBRATE权限
try {
L
lixiangpeng5 已提交
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
  // 启动自定义振动
  vibrator.startVibration({
    type: "file",
    hapticFd: { fd: fileDescriptor.fd, offset: fileDescriptor.offset, length: fileDescriptor.length }
  }, {
    usage: "alarm"
  }).then(() => {
    console.info('Succeed in starting vibration');
  }, (error) => {
    console.error(`Failed to start vibration. Code: ${error.code}, message: ${error.message}`);
  });
  // 停止所有类型的马达振动
  vibrator.stopVibration(function (error) {
    if (error) {
      console.error(`Failed to stop vibration. Code: ${error.code}, message: ${error.message}`);
      return;
    }
    console.info('Succeed in stopping vibration');
  })
L
lixiangpeng5 已提交
260
} catch (error) {
L
lixiangpeng5 已提交
261
  console.error(`An unexpected error occurred. Code: ${error.code}, message: ${error.message}`);
L
lixiangpeng5 已提交
262 263
}
// 关闭振动文件资源
L
lixiangpeng5 已提交
264 265 266 267 268
getContext().resourceManager.closeRawFd(FILE_NAME).then(() => {
  console.info('Succeed in closing resource file descriptor');
}).catch(error => {
  console.error(`Failed to close resource file descriptor. Code: ${error.code}, message: ${error.message}`);
});
L
lixiangpeng5 已提交
269 270
```

C
cff-gite 已提交
271

Z
zengyawen 已提交
272 273 274 275
## 相关实例

针对振动开发,有以下相关实例可供参考:

L
lixiangpeng5 已提交
276
- [`Vibrator`:振动(ArkTS)(API9)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/DeviceManagement/Vibrator/BasicVibration)
L
lixiangpeng5 已提交
277
- [`CustomHaptic`:自定义振动(ArkTS)(API10)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/DeviceManagement/Vibrator/CustomHaptic)