提交 60dd40eb 编写于 作者: L lixiangpeng5

fix by review 0612-2103

Signed-off-by: Nlixiangpeng5 <lixiangpeng5@huawei.com>
Change-Id: Ifeaebbe30942e54da2b39dbf07ca53a7f34d2ff1
上级 5dda5890
...@@ -21,11 +21,15 @@ ...@@ -21,11 +21,15 @@
| ohos.vibrator | isSupportEffect(effectId: string): Promise&lt;boolean&gt; | 查询是否支持传入的参数effectId。返回true则表示支持,否则不支持 | | ohos.vibrator | isSupportEffect(effectId: string): Promise&lt;boolean&gt; | 查询是否支持传入的参数effectId。返回true则表示支持,否则不支持 |
| ohos.vibrator | isSupportEffect(effectId: string, callback: AsyncCallback&lt;boolean&gt;): void | 查询是否支持传入的参数effectId。返回true则表示支持,否则不支持 | | ohos.vibrator | isSupportEffect(effectId: string, callback: AsyncCallback&lt;boolean&gt;): void | 查询是否支持传入的参数effectId。返回true则表示支持,否则不支持 |
## 自定义振动支持的格式
## 自定义振动格式
自定义振动提供给用户设计自己所需振动效果的能力,用户可通过自定义振动配置文件,并遵循相应规则编排所需振动形式,使能更加开放的振感交互体验。
自定义振动配置文件为Json格式,在形式上如下所示: 自定义振动配置文件为Json格式,在形式上如下所示:
```js ```js
{ {
"MetaData": { "MetaData": {
"Create": "2023-01-09", "Create": "2023-01-09",
"Description": "a haptic case", "Description": "a haptic case",
...@@ -62,13 +66,13 @@ ...@@ -62,13 +66,13 @@
] ]
} }
] ]
} }
``` ```
Json共包含2个属性。"MetaData":文件头信息,可在相应属性中添加描述,必填项:"Version"表示文件格式的版本号,向前兼容,目前起步仅支持版本1.0;"ChannelNumber"表示马达振动的通道数,目前仅支持单通道,规定为1。其他为选填项:"Create"可记录文件创作时间;"Description"可指明振动效果、创建信息等附加说明。"Channels":马达振动通道的相关信息。 Json文件共包含2个属性。"MetaData"为文件头信息,可在相应属性中添加描述,其中包含必填项:"Version"表示文件格式的版本号,向前兼容,目前起步仅支持版本1.0;"ChannelNumber"表示马达振动的通道数,目前仅支持单通道,规定为1;其他为选填项:"Create"可记录文件创作时间;"Description"可指明振动效果、创建信息等附加说明。"Channels"为马达振动通道的相关信息。
```js ```js
{ {
"MetaData": { "MetaData": {
"Create": "2023-01-09", "Create": "2023-01-09",
"Description": "a haptic case", "Description": "a haptic case",
...@@ -76,56 +80,56 @@ Json共包含2个属性。"MetaData":文件头信息,可在相应属性中 ...@@ -76,56 +80,56 @@ Json共包含2个属性。"MetaData":文件头信息,可在相应属性中
"ChannelNumber": 1 "ChannelNumber": 1
}, },
"Channels": [ ... ] "Channels": [ ... ]
} }
``` ```
"Channels"是Json数组,表示各个通道的信息,包含两个属性。"Parameters":对改通道参数设置。"Index"为通道编号,单通道下规定为1,其他参数待后续扩展。"Pattern":为马达振动序列,为Json数组。 "Channels"是Json数组,表示各个通道的信息,包含两个属性。"Parameters"为通道参数,其中,"Index"为通道编号,单通道下规定为1,其他参数待后续扩展。"Pattern"为马达振动序列,为Json数组。
```js ```js
"Channels": [ "Channels": [
{ {
"Parameters": { "Parameters": {
"Index": 1 "Index": 1
}, },
"Pattern": [ ... ] "Pattern": [ ... ]
} }
] ]
``` ```
"Pattern"中每个"Event"属性代表1个振动事件,支持添加2种振动类型。类型1:"transient"类型,瞬态短振动,干脆有力;类型2:"continuous"类型,稳态长振动,具备长时间输出强劲有力振动的能力。 "Pattern"中每个"Event"属性代表1个振动事件,支持添加2种振动类型。类型1:"transient"类型,瞬态短振动,干脆有力;类型2:"continuous"类型,稳态长振动,具备长时间输出强劲有力振动的能力。
```js ```js
"Pattern": [ "Pattern": [
{ {
"Event": { "Event": {
"Type": "transient", "Type": "transient",
"StartTime": 0, "StartTime": 0,
"Parameters": { "Parameters": {
"Intensity": 100, "Intensity": 100,
"Frequency": 31 "Frequency": 31
}
} }
}, }
{ },
"Event": { {
"Type": "continuous", "Event": {
"StartTime": 100, "Type": "continuous",
"Duration": 54, "StartTime": 100,
"Parameters": { "Duration": 54,
"Intensity": 38, "Parameters": {
"Frequency": 30 "Intensity": 38,
} "Frequency": 30
} }
} }
] }
``` ]
```
振动事件参数信息具体如下表: 振动事件参数信息具体如下表:
| 参数 | 说明 | 范围| | 参数 | 说明 | 范围|
| --- | ------------------------ | ---| | --- | ------------------------ | ---|
| Type | 振动事件类型 | "transient" 或"continuous"| | Type | 振动事件类型 | "transient" 或"continuous"|
| StartTime | 振动的起始时间 | 单位ms,有效范围为[0, 1800 000],振动事件不能重叠| | StartTime | 振动的起始时间 | 单位ms,有效范围为[0, 1800 000],振动事件不能重叠|
| Duration | 振动持续时间,仅当类型为"continuous"时可用 | 单位ms,有效范围为(10, 1600)| | Duration | 振动持续时间,仅当类型为"continuous"时可用 | 单位ms,有效范围为(10, 1600)|
| Intensity | 振动强度 | 有效范围为[0, 100],这里的强度值为相对值,并不代表真实强度| | Intensity | 振动强度 | 有效范围为[0, 100],这里的强度值为相对值,并不代表真实强度|
| Frequency | 振动频率 | 有效范围为[0, 100],这里的频率值为相对值,并不代表真实频率| | Frequency | 振动频率 | 有效范围为[0, 100],这里的频率值为相对值,并不代表真实频率|
...@@ -137,182 +141,184 @@ Json共包含2个属性。"MetaData":文件头信息,可在相应属性中 ...@@ -137,182 +141,184 @@ Json共包含2个属性。"MetaData":文件头信息,可在相应属性中
| 振动事件(event)的数量 | 不得超过128个 | | 振动事件(event)的数量 | 不得超过128个 |
| 振动配置文件长度 | 不得超过64KB | | 振动配置文件长度 | 不得超过64KB |
## 开发步骤 ## 开发步骤
1. 控制设备上的振动器,需要申请权限ohos.permission.VIBRATE。具体配置方式请参考[权限申请声明](../security/accesstoken-guidelines.md) 1. 控制设备上的振动器,需要申请权限ohos.permission.VIBRATE。具体配置方式请参考[权限申请声明](../security/accesstoken-guidelines.md)
2. 根据指定振动效果和振动属性触发马达振动。 2. 根据指定振动效果和振动属性触发马达振动。
```js ```js
import vibrator from '@ohos.vibrator'; import vibrator from '@ohos.vibrator';
try { try {
vibrator.startVibration({ // 使用startVibration需要添加ohos.permission.VIBRATE权限 vibrator.startVibration({ // 使用startVibration需要添加ohos.permission.VIBRATE权限
type: 'time', type: 'time',
duration: 1000, duration: 1000,
}, { }, {
id: 0, id: 0,
usage: 'alarm' usage: 'alarm'
}, (error) => { }, (error) => {
if (error) { if (error) {
console.error('vibrate fail, error.code: ' + error.code + 'error.message: ', + error.message); console.error('vibrate fail, error.code: ' + error.code + 'error.message: ', + error.message);
return; return;
} }
console.log('Callback returned to indicate a successful vibration.'); console.log('Callback returned to indicate a successful vibration.');
}); });
} catch (err) { } catch (err) {
console.error('errCode: ' + err.code + ' ,msg: ' + err.message); console.error('errCode: ' + err.code + ' ,msg: ' + err.message);
} }
``` ```
3. 按照指定模式停止马达的振动。 3. 按照指定模式停止马达的振动。
```js ```js
import vibrator from '@ohos.vibrator'; import vibrator from '@ohos.vibrator';
try { try {
// 按照VIBRATOR_STOP_MODE_TIME模式停止振动, 使用stopVibration需要添加ohos.permission.VIBRATE权限 // 按照VIBRATOR_STOP_MODE_TIME模式停止振动, 使用stopVibration需要添加ohos.permission.VIBRATE权限
vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME, function (error) { vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME, function (error) {
if (error) { if (error) {
console.log('error.code' + error.code + 'error.message' + error.message); console.log('error.code' + error.code + 'error.message' + error.message);
return; return;
} }
console.log('Callback returned to indicate successful.'); console.log('Callback returned to indicate successful.');
}) })
} catch (err) { } catch (err) {
console.info('errCode: ' + err.code + ' ,msg: ' + err.message); console.info('errCode: ' + err.code + ' ,msg: ' + err.message);
} }
``` ```
4. 停止所有模式的马达振动。 4. 停止所有模式的马达振动。
```js ```js
import vibrator from '@ohos.vibrator'; import vibrator from '@ohos.vibrator';
// 使用startVibration、stopVibration需要添加ohos.permission.VIBRATE权限 // 使用startVibration、stopVibration需要添加ohos.permission.VIBRATE权限
try { try {
vibrator.startVibration({ vibrator.startVibration({
type: 'time', type: 'time',
duration: 1000, duration: 1000,
}, { }, {
id: 0, id: 0,
usage: 'alarm' usage: 'alarm'
}, (error) => { }, (error) => {
if (error) { if (error) {
console.error('vibrate fail, error.code: ' + error.code + 'error.message: ', + error.message); console.error('vibrate fail, error.code: ' + error.code + 'error.message: ', + error.message);
return; return;
} }
console.log('Callback returned to indicate a successful vibration.'); console.log('Callback returned to indicate a successful vibration.');
}); });
// 停止所有类型的马达振动 // 停止所有类型的马达振动
vibrator.stopVibration(function (error) { vibrator.stopVibration(function (error) {
if (error) { if (error) {
console.log('error.code' + error.code + 'error.message' + error.message); console.log('error.code' + error.code + 'error.message' + error.message);
return; return;
} }
console.log('Callback returned to indicate successful.'); console.log('Callback returned to indicate successful.');
}) })
} catch (error) { } catch (error) {
console.info('errCode: ' + error.code + ' ,msg: ' + error.message); console.info('errCode: ' + error.code + ' ,msg: ' + error.message);
} }
``` ```
5. 查询是否支持传入的参数effectId。 5. 查询是否支持传入的参数effectId。
```js ```js
import vibrator from '@ohos.vibrator'; import vibrator from '@ohos.vibrator';
try { try {
// 查询是否支持'haptic.clock.timer' // 查询是否支持'haptic.clock.timer'
vibrator.isSupportEffect('haptic.clock.timer', function (err, state) { vibrator.isSupportEffect('haptic.clock.timer', function (err, state) {
if (err) { if (err) {
console.error('isSupportEffect failed, error:' + JSON.stringify(err)); console.error('isSupportEffect failed, error:' + JSON.stringify(err));
return; return;
} }
console.log('The effectId is ' + (state ? 'supported' : 'unsupported')); console.log('The effectId is ' + (state ? 'supported' : 'unsupported'));
if (state) { if (state) {
try { try {
vibrator.startVibration({ // 使用startVibration需要添加ohos.permission.VIBRATE权限 vibrator.startVibration({ // 使用startVibration需要添加ohos.permission.VIBRATE权限
type: 'preset', type: 'preset',
effectId: 'haptic.clock.timer', effectId: 'haptic.clock.timer',
count: 1, count: 1,
}, { }, {
usage: 'unknown' usage: 'unknown'
}, (error) => { }, (error) => {
if(error) { if(error) {
console.error('haptic.clock.timer vibrator error:' + JSON.stringify(error)); console.error('haptic.clock.timer vibrator error:' + JSON.stringify(error));
} else { } else {
console.log('haptic.clock.timer vibrator success'); console.log('haptic.clock.timer vibrator success');
} }
}); });
} catch (error) { } catch (error) {
console.error('Exception in, error:' + JSON.stringify(error)); console.error('Exception in, error:' + JSON.stringify(error));
} }
} }
}) })
} catch (error) { } catch (error) {
console.error('Exception in, error:' + JSON.stringify(error)); console.error('Exception in, error:' + JSON.stringify(error));
} }
``` ```
6. 启动和停止自定义振动 6. 启动和停止自定义振动
```js ```js
import vibrator from '@ohos.vibrator'; import vibrator from '@ohos.vibrator';
import resourceManager from '@ohos.resourceManager'; import resourceManager from '@ohos.resourceManager';
const FILE_NAME = "xxx.json"; const FILE_NAME = "xxx.json";
async function openResource(fileName) { async function openResource(fileName) {
let fileDescriptor = undefined; let fileDescriptor = undefined;
let mgr = await resourceManager.getResourceManager(); let mgr = await resourceManager.getResourceManager();
await mgr.getRawFd(fileName).then(value => { await mgr.getRawFd(fileName).then(value => {
fileDescriptor = {fd: value.fd, offset: value.offset, length: value.length}; fileDescriptor = {fd: value.fd, offset: value.offset, length: value.length};
console.log('openResource success fileName: ' + fileName); console.log('openResource success fileName: ' + fileName);
}).catch(error => { }).catch(error => {
console.log('openResource err: ' + error); console.log('openResource err: ' + error);
}); });
return fileDescriptor; return fileDescriptor;
} }
async function closeResource(fileName) { async function closeResource(fileName) {
let mgr = await resourceManager.getResourceManager(); let mgr = await resourceManager.getResourceManager();
await mgr.closeRawFd(fileName).then(()=> { await mgr.closeRawFd(fileName).then(()=> {
console.log('closeResource success fileName: ' + fileName); console.log('closeResource success fileName: ' + fileName);
}).catch(error => { }).catch(error => {
console.log('closeResource err: ' + error); console.log('closeResource err: ' + error);
}); });
} }
// 获取振动文件资源描述符 // 获取振动文件资源描述符
let rawFd = openResource(FILE_NAME); let rawFd = openResource(FILE_NAME);
// 使用startVibration、stopVibration需要添加ohos.permission.VIBRATE权限 // 使用startVibration、stopVibration需要添加ohos.permission.VIBRATE权限
try { try {
// 启动自定义振动 // 启动自定义振动
vibrator.startVibration({ vibrator.startVibration({
type: "file", type: "file",
hapticFd: { fd: rawFd.fd, offset: rawFd.offset, length: rawFd.length } hapticFd: { fd: rawFd.fd, offset: rawFd.offset, length: rawFd.length }
}, { }, {
usage: "alarm" usage: "alarm"
}).then(() => { }).then(() => {
console.info('startVibration success'); console.info('startVibration success');
}, (error) => { }, (error) => {
console.info('startVibration error'); console.info('startVibration error');
}); });
// 停止所有类型的马达振动 // 停止所有类型的马达振动
vibrator.stopVibration(function (error) { vibrator.stopVibration(function (error) {
if (error) { if (error) {
console.log('error.code' + error.code + 'error.message' + error.message); console.log('error.code' + error.code + 'error.message' + error.message);
return; return;
} }
console.log('Callback returned to indicate successful.'); console.log('Callback returned to indicate successful.');
}) })
} catch (error) { } catch (error) {
console.info('errCode: ' + error.code + ' ,msg: ' + error.message); console.info('errCode: ' + error.code + ' ,msg: ' + error.message);
} }
// 关闭振动文件资源 // 关闭振动文件资源
closeResource(FILE_NAME); closeResource(FILE_NAME);
``` ```
## 相关实例 ## 相关实例
针对振动开发,有以下相关实例可供参考: 针对振动开发,有以下相关实例可供参考:
- [`Vibrator`:振动(ArkTS)(API9)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/DeviceManagement/Vibrator/BasicVibration) - [`Vibrator`:振动(ArkTS)(API9)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/DeviceManagement/Vibrator/BasicVibration)
- [`CustomHaptic`:自定义振动(ArkTS)(API10)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/DeviceManagement/Vibrator/CustomHaptic) - [`CustomHaptic`:自定义振动(ArkTS)(API10)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/DeviceManagement/Vibrator/CustomHaptic)
\ No newline at end of file
...@@ -434,7 +434,7 @@ try { ...@@ -434,7 +434,7 @@ try {
预置的振动效果。 预置的振动效果。
**系统能力**以下各项对应的系统能力均为SystemCapability.Sensors.MiscDevice **系统能力**:SystemCapability.Sensors.MiscDevice
| 名称 | 值 | 说明 | | 名称 | 值 | 说明 |
| ------------------ | -------------------- | -------------------------------- | | ------------------ | -------------------- | -------------------------------- |
...@@ -445,7 +445,7 @@ try { ...@@ -445,7 +445,7 @@ try {
停止的振动模式。 停止的振动模式。
**系统能力**以下各项对应的系统能力均为SystemCapability.Sensors.MiscDevice **系统能力**:SystemCapability.Sensors.MiscDevice
| 名称 | 值 | 说明 | | 名称 | 值 | 说明 |
| ------------------------- | -------- | ------------------------------ | | ------------------------- | -------- | ------------------------------ |
...@@ -456,76 +456,76 @@ try { ...@@ -456,76 +456,76 @@ try {
马达振动效果。 马达振动效果。
**系统能力**以下各项对应的系统能力均为SystemCapability.Sensors.MiscDevice **系统能力**:SystemCapability.Sensors.MiscDevice
| 类型 | 说明 | | 类型 | 说明 |
| -------------------------------- | ------------------------------ | | -------------------------------- | ------------------------------ |
| [VibrateTime](#vibratetime9) | 按照指定持续时间触发马达振动。 | | [VibrateTime](#vibratetime9) | 按照指定持续时间触发马达振动。 |
| [VibratePreset](#vibratepreset9) | 按照预置振动类型触发马达振动。 | | [VibratePreset](#vibratepreset9) | 按照预置振动类型触发马达振动。 |
| [VibrateFromFile](#vibratefromfile10) | 按照振动配置文件触发马达振动。 | | [VibrateFromFile<sup>10+</sup>](#vibratefromfile10) | 按照自定义振动配置文件触发马达振动。 |
## VibrateTime<sup>9+</sup> ## VibrateTime<sup>9+</sup>
马达振动时长。 马达振动时长。
**系统能力**以下各项对应的系统能力均为SystemCapability.Sensors.MiscDevice **系统能力**:SystemCapability.Sensors.MiscDevice
| 名称 | | 说明 | | 名称 | 类型 | 说明 |
| -------- | ------ | ------------------------------ | | -------- | ------ | ------------------------------ |
| type | "time" | 按照指定持续时间触发马达振动。 | | type | string | 值为"time",按照指定持续时间触发马达振动。 |
| duration | - | 马达持续振动时长, 单位ms。 | | duration | number | 马达持续振动时长, 单位ms。 |
## VibratePreset<sup>9+</sup> ## VibratePreset<sup>9+</sup>
马达预置振动类型。 马达预置振动类型。
**系统能力**以下各项对应的系统能力均为SystemCapability.Sensors.MiscDevice **系统能力**:SystemCapability.Sensors.MiscDevice
| 名称 | | 说明 | | 名称 | 类型 | 说明 |
| -------- | -------- | ------------------------------ | | -------- | -------- | ------------------------------ |
| type | "preset" | 按照预置振动效果触发马达振动。 | | type | string | 值为"preset",按照预置振动效果触发马达振动。 |
| effectId | - | 预置的振动效果ID。 | | effectId | string | 预置的振动效果ID。 |
| count | - | 重复振动的次数。 | | count | number | 重复振动的次数。 |
## VibrateFromFile<sup>10+</sup> ## VibrateFromFile<sup>10+</sup>
自定义振动类型,仅部分设备支持。 自定义振动类型,仅部分设备支持。
**系统能力**以下各项对应的系统能力均为SystemCapability.Sensors.MiscDevice **系统能力**:SystemCapability.Sensors.MiscDevice
| 名称 | | 说明 | | 名称 | 类型 | 说明 |
| -------- | -------- | ------------------------------ | | -------- | -------- | ------------------------------ |
| type | "file" | 按照振动配置文件触发马达振动。 | | type | string | 值为"file",按照振动配置文件触发马达振动。 |
| hapticFd | - | 振动配置文件的描述符,类型为[HapticFileDescriptor](#hapticfiledescriptor10)| | hapticFd | [HapticFileDescriptor](#hapticfiledescriptor10) | 振动配置文件的描述符。|
## HapticFileDescriptor<sup>10+</sup> ## HapticFileDescriptor<sup>10+</sup>
自定义振动配置文件描述符,必须确认资源文件可用,可通过[文件管理API](js-apis-file-fs.md#fsopen)从沙箱路径获取或者通过[资源管理API](js-apis-resource-manager.md#getrawfd9)从HAP资源获取。使用场景:振动序列被存储在一个文件中,需要根据偏移量和长度进行振动,振动序列存储格式,请参考[自定义振动格式](../../device/vibrator-guidelines.md#自定义振动支持的格式) 自定义振动配置文件的描述符,必须确认资源文件可用,可通过[文件管理API](js-apis-file-fs.md#fsopen)从沙箱路径获取或者通过[资源管理API](js-apis-resource-manager.md#getrawfd9)从HAP资源获取。使用场景:振动序列被存储在一个文件中,需要根据偏移量和长度进行振动,振动序列存储格式,请参考[自定义振动格式](../../device/vibrator-guidelines.md#自定义振动格式)
**系统能力**以下各项对应的系统能力均为SystemCapability.Sensors.MiscDevice **系统能力**:SystemCapability.Sensors.MiscDevice
| 名称 | 类型 | 必填 | 说明 | | 名称 | 类型 | 必填 | 说明 |
| -------- | -------- |--------| ------------------------------ | | -------- | -------- |--------| ------------------------------|
| fd | number | 是 | 文件描述符。 | | fd | number | 是 | 资源文件描述符。 |
| offset | number | 否 | 文件指针起始偏移量,默认值为文件起始位置。 | | offset | number | 否 | 距文件起始位置的偏移量,单位为字节,默认为文件起始位置,不可超出文件有效范围。|
| length | number | 否 | 文件长度,默认值为从偏移位置至文件结尾的大小。 | | length | number | 否 | 资源长度,单位为字节,默认值为从偏移位置至文件结尾的长度,不可超出文件有效范围。|
## VibrateAttribute<sup>9+</sup> ## VibrateAttribute<sup>9+</sup>
马达振动属性。 马达振动属性。
**系统能力**以下各项对应的系统能力均为SystemCapability.Sensors.MiscDevice **系统能力**:SystemCapability.Sensors.MiscDevice
| 名称 | | 说明 | | 名称 | 类型 | 说明 |
| ----- | ------ | -------------- | | ----- | ------ | -------------- |
| id | 0 | 振动器id。 | | id | number | 默认值为0,振动器id。 |
| usage | - | 马达振动的使用场景。 | | usage | [Usage](#usage9) | 马达振动的使用场景。 |
## Usage<sup>9+</sup> ## Usage<sup>9+</sup>
振动使用场景。 振动使用场景。
**系统能力**以下各项对应的系统能力均为SystemCapability.Sensors.MiscDevice **系统能力**:SystemCapability.Sensors.MiscDevice
| 名称 | 类型 | 说明 | | 名称 | 类型 | 说明 |
| ---------------- | ------ | ------------------------------ | | ---------------- | ------ | ------------------------------ |
......
# 泛Sensor子系统Changelog # 泛Sensor子系统Changelog
## cl.vibrator.1 新增自定义振动相关属性 ## cl.vibrator.1 新增自定义振动相关属性
新增自定义振动效果属性VibrateFromFile,自定义振动配置文件描述符属性HapticFileDescriptor;振动下发接口startVibration支持的振动效果由VibrateEffect = VibrateTime | VibratePreset扩展为VibrateEffect = VibrateTime | VibratePreset | VibrateFromFile。 新增自定义振动效果属性VibrateFromFile,自定义振动配置文件描述符属性HapticFileDescriptor;振动下发接口startVibration支持的振动效果由VibrateEffect = VibrateTime | VibratePreset扩展为VibrateEffect = VibrateTime | VibratePreset | VibrateFromFile。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册