灯光服务

灯光服务提供 API 调用控制设备灯光的能力。作为灯光服务访问代理的 LightManager 对象, 提供了灯光服务的主要 API,可通过 RobotContext 对象获取到。

LightManager lightManager = aRobotContext.getSystemService(LightManager.SERVICE);

获取灯光列表

获取设备拥有的灯光数量以及灯光的详细信息,可通过以下代码实现:

List<LightDevice> /* [1] */ devices = lightManager.getDeviceList();

[1] 灯光集合,LightDevice 是灯光的信息,具体包括:

属性 getter 说明
LightDevice.id 灯光的唯一标识
LightDevice.name 灯光的名称
LightDevice.description 灯光的描述

如果想通过灯光的 id 查找到灯光的详细信息,可通过以下代码实现:

try {
    LightDevice lightDevice = lightManager.getDevice("lightId");
} catch (LightNotFoundException e) {
    // 灯光的详细没有查到时将运行至此
}

开-关灯

如果想打开灯光,可通过以下代码实现:

Map<String, Integer> /* [1] */ devices = new HashMap<>();
devices.put("lightId", Color.BLUE);
lightManager.turnOn(devices);

[1] 想要打开的灯光的集合,key 是灯光的 id,value 是灯光打开后显示的颜色。

如果只想打开一个灯光,可通过如下代码实现:

lightManager.turnOn("lightId", Color.BLUE);

如果想关闭灯光,可通过如下代码实现:

List<String> devices = new ArrayList<>();
devices.add("lightId");
lightManager.turnOff(devices);

如果想关闭多个灯,但又不想创建集合,可通过如下代码实现:

lightManager.turnOff("lightId001", "lightId002");

如果只想关闭一个灯光,可通过如下代码实现:

lightManager.turnOff("lightId");

如果想要知道灯光是打开还是关闭,可通过如下代码实现:

boolean isTurnedOn = lightManager.isTurnedOn("lightId");

返回值 isTurnedOntrue 表示灯光是打开的。

改变灯光颜色

如果想要改变灯光颜色,可通过如下代码实现:

Map<String, Integer> /* [1] */ devices = new HashMap<>();
devices.put("lightId", Color.BLUE);
lightManager.changeColors(devices);

[1] 想要改变颜色的灯光的集合,key 是灯光的 id,value 是灯光显示的颜色。

如果只想改变一个灯光的颜色,可通过如下代码实现:

lightManager.changeColor("lightId", Color.BLUE);

如果想要获取灯光的颜色,可通过如下代码实现:

int color = lightManager.getColor("lightId");

改变灯效

如果想要让灯光展示一些动态效果,可通过如下代码实现:

promise /* [2] */  = lightManager.displayEffect("lightId",
    Uri.parse("light://effect/1") /* [1] */)
    .progress(new ProgressCallback<DisplayProgress>() {
        @Override
        public void onProgress(DisplayProgress displayProgress /* [3] */) {
            // 灯效展示过程会多次运行至此
        }
    })
    .done(new DoneCallback<Void>() {
        @Override
        public void onDone(Void aVoid) {
            // 灯效展示完毕会运行至此
        }
    })
    .fail(new FailCallback<LightException>() {
        @Override
        public void onFail(LightException e) {
            // 灯效展示出错会运行至此
        }
    });

[1] 要展示的灯效的唯一标识。

[2] 返回等待展示进度与结果的异步对象,通过该对象可等待或监听进度与结果以及取消展示过程。具体用法参考 Promise

[3] 异步回调的 DisplayProgress 对象描述了灯效展示的进度信息,具体包括:

属性 getter 说明
DisplayProgress.progress 进度信息
began:展示开始
ended:展示结束

通过指定选项,可调整灯光展示的行为。

DisplayOption /* [1] */ option = new DisplayOption.Builder(
    "lightId",Uri.parse("light://effect/1")).build();
promise = lightManager.displayEffect(option);

[1] DisplayOption 对象通过 DisplayOption.Builder 构建, 使用说明如下:

方法 说明 默认值
Builder.constructor(lightId, effectUri) 构造时必须传入灯光的 id, 以及灯效的唯一标识
Builder.setSticky(sticky) 展示过程是否允许被其他线程打断
true : 不运行被打断
false
Builder.setLoops(loops) 循环展示的次数
0:无线循环
0
Builder.setExtension(extension) 自定义参数 JsonObjectString.EMPTY_OBJECT

如果想展示多个灯效,可指定多个选项,通过如下 2 种方式实现:

DisplayOption option1 = new DisplayOption.Builder(
    "lightId001",Uri.parse("light://effect/1")).setLoops(1).build();
DisplayOption option2 = new DisplayOption.Builder(
    "lightId002",Uri.parse("light://effect/2")).setLoops(1).build();
promise = lightManager.displayEffectSerially(option1, option2);
List<DisplayOption> options = new ArrayList<>();
options.add(option1);
options.add(option2);
promise = lightManager.displayEffectSerially(options);

灯光灯效列表

灯光和灯效可以通过常量设置

灯光颜色 int
红色 RED
白色 WHITE
蓝色 BLUE
绿色 GREEN
橙色 ORANGE
黄色 CYAN
紫色 PURPLE
灯效 int
呼吸 BREATHE
警报效果 WARNING
闪一次 FLASH_ONE
闪两次 FLASH_TWO
常亮3秒 BRIGHT_3_SECOND
常亮 BRIGHT_INFINITY