HarmonyOS学习路之开发篇—设备管理(控制类小器件)

2023-10-15 08:56:24 浏览数 (1)

控制类小器件开发概述

基本概念

控制类小器件指的是设备上的LED灯和振动器。其中,LED灯主要用作指示(如充电状态)、闪烁功能(如三色灯)等;振动器主要用于闹钟、开关机振动、来电振动等场景。

运作机制

控制类小器件主要包含以下四个模块:控制类小器件API、控制类小器件Framework、控制类小器件Service、HD_IDL层。

图1 控制类小器件

  • 控制类小器件API:提供灯和振动器基础的API,主要包含灯的列表查询、打开灯、关闭灯等接口,振动器的列表查询、振动器的振动器效果查询、触发/关闭振动器等接口。
  • 控制类小器件Framework:主要实现灯和振动器的框架层管理,实现与控制类小器件Service的通信。
  • 控制类小器件Service:实现灯和振动器的服务管理。
  • HD_IDL层:对不同设备的适配。

约束与限制

  • 在调用Light API时,请先通过getLightIdList接口查询设备所支持的灯的ID列表,以免调用打开接口异常。
  • 在调用Vibrator API时,请先通过getVibratorIdList接口查询设备所支持的振动器的ID列表,以免调用振动接口异常。
  • 在使用振动器时,开发者需要配置请求振动器的权限ohos.permission.VIBRATE,才能控制振动器振动。

Light开发

场景介绍

当设备需要设置不同的闪烁效果时,可以调用Light模块,例如,LED灯能够设置灯颜色、灯亮和灯灭时长的闪烁效果。

说明 使用该功能依赖于硬件设备是否具有LED灯。

接口说明

灯模块主要提供的功能有:查询设备上灯的列表,查询某个灯设备支持的效果,打开和关闭灯设备。LightAgent类开放能力如下,具体请查阅API参考文档。

接口名

描述

getLightIdList()

获取硬件设备上的灯列表。

isSupport(int)

根据指定灯Id查询硬件设备是否有该灯。

isEffectSupport(int, String)

查询指定的灯是否支持指定的闪烁效果。

turnOn(int, String)

对指定的灯创建指定效果的一次性闪烁。

turnOn(int, LightEffect)

对指定的灯创建自定义效果的一次性闪烁。

turnOn(String)

对指定的灯创建指定效果的一次性闪烁。

turnOn(LightEffect)

对指定的灯创建自定义效果的一次性闪烁。

turnOff(int)

关闭指定的灯。

turnOff()

关闭指定的灯。

开发步骤

  1. 查询硬件设备上灯的列表。
  2. 查询指定的灯是否支持指定的闪烁效果。
  3. 创建不同的闪烁效果。
  4. 关闭指定的灯。
代码语言:javascript复制
private LightAgent lightAgent = new LightAgent();

@Override
public void onStart(Intent intent) {
    super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_light_layout);

    // ...

    // 查询硬件设备上的灯列表
    List<Integer> myLightList = lightAgent.getLightIdList();
    if (myLightList.isEmpty()) {
        return;
    }
    int lightId = myLightList.get(0);

    // 查询指定的灯是否支持指定的闪烁效果
    boolean isSupport = lightAgent.isEffectSupport(lightId, LightEffect.LIGHT_ID_KEYBOARD);

    // 创建指定效果的一次性闪烁
    boolean turnOnResult = lightAgent.turnOn(lightId, LightEffect.LIGHT_ID_KEYBOARD);

    // 创建自定义效果的一次性闪烁
    LightBrightness lightBrightness = new LightBrightness(255, 255, 255);
    LightEffect lightEffect = new LightEffect(lightBrightness, 1000, 1000);
    boolean turnOnEffectResult = lightAgent.turnOn(lightId, lightEffect);

    // 关闭指定的灯
    boolean turnOffResult = lightAgent.turnOff(lightId);
}

Vibrator开发

场景介绍

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

接口说明

振动器模块主要提供的功能有:查询设备上振动器的列表,查询某个振动器是否支持某种振动效果,触发和关闭振动器。VibratorAgent类开放能力如下,具体请查阅API参考文档。

接口名

描述

getVibratorIdList()

获取硬件设备上的振动器列表。

isSupport(int)

根据指定的振动器Id查询硬件设备是否存在该振动器。

isEffectSupport(int, String)

查询指定的振动器是否支持指定的震动效果。

startOnce(int, String)

对指定的振动器创建指定效果的一次性振动。

startOnce​(String)

对指定的振动器创建指定效果的一次性振动。

startOnce(int, int)

对指定的振动器创建指定振动时长的一次性振动。

startOnce​(int)

对指定的振动器创建指定振动时长的一次性振动。

start(String, boolean)

对指定的振动器以预设的某种振动效果进行循环振动。

start(int, VibrationPattern)

对指定的振动器创建自定义效果的波形或一次性振动。

start​(VibrationPattern)

对指定的振动器创建自定义效果的波形或一次性振动。

stop(int, String)

关闭指定的振动器指定模式的振动。

stop(String)

关闭指定的振动器指定模式的振动。

开发步骤

  • 控制设备上的振动器,需要在“config.json”里面进行配置请求权限。具体如下:
代码语言:javascript复制
"reqPermissions": [
    {
        "name": "ohos.permission.VIBRATE",
        "reason": "",
        "usedScene": {
            "ability": [
                ".MainAbility"
            ],
            "when": "inuse"
        }
    }
]
  • 查询硬件设备上的振动器列表。
  • 查询指定的振动器是否支持指定的震动效果。
  • 创建不同效果的振动。
  • 关闭指定的振动器指定模式的振动。
代码语言:javascript复制
private VibratorAgent vibratorAgent = new VibratorAgent();

private int[] timing = {1000, 1000, 2000, 5000};

private int[] intensity = {50, 100, 200, 255};

@Override
public void onStart(Intent intent) {
    super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_vibrator_layout);

    // ...

    // 查询硬件设备上的振动器列表
    List<Integer> vibratorList = vibratorAgent.getVibratorIdList();
    if (vibratorList.isEmpty()) {
        return;
    }
    int vibratorId = vibratorList.get(0);

    // 查询指定的振动器是否支持指定的振动效果
    boolean isSupport = vibratorAgent.isEffectSupport(vibratorId,
            VibrationPattern.VIBRATOR_TYPE_CAMERA_CLICK);

    // 创建指定效果的一次性振动
    boolean vibrateEffectResult = vibratorAgent.startOnce(vibratorId,
            VibrationPattern.VIBRATOR_TYPE_CAMERA_CLICK);

    // 创建指定振动时长的一次性振动
    int vibratorTiming = 1000;
    boolean vibrateResult = vibratorAgent.startOnce(vibratorId, vibratorTiming);

    // 以预设的某种振动效果进行循环振动
    boolean vibratorRepeatEffect = vibratorAgent.start(VibrationPattern.VIBRATOR_TYPE_RINGTONE_BOUNCE, true);
    // 控制振动器停止循环振动
    vibratorAgent.stop();

    // 创建自定义效果的周期性波形振动
    int count = 5;
    VibrationPattern vibrationPeriodEffect = VibrationPattern.createPeriod(timing, intensity, count);
    boolean vibratePeriodResult = vibratorAgent.start(vibratorId, vibrationPeriodEffect);

    // 创建自定义效果的一次性振动
    VibrationPattern vibrationOnceEffect = VibrationPattern.createSingle(3000, 50);
    boolean vibrateSingleResult = vibratorAgent.start(vibratorId, vibrationOnceEffect);

    // 关闭指定的振动器自定义模式的振动
    boolean stopResult = vibratorAgent.stop(vibratorId,
            VibratorAgent.VIBRATOR_STOP_MODE_CUSTOMIZED);
}

0 人点赞