前言
在日常生活中,它为人们在黑暗环境中提供照明,如夜间行走、寻找物品、检查电器设备或处理突发的停电情况。尤其对于居住在电力供应不稳定地区的人们,手电筒是必备的工具。
在户外活动中,如露营、徒步旅行、探险等,手电筒能帮助人们看清道路、识别方向、避免危险。它也是紧急情况下的重要信号工具,通过闪烁灯光来引起救援人员的注意。
在工作场景中,维修工人、电力工程师等常常需要手电筒来照亮狭小或昏暗的工作空间,以便进行准确的操作和检查。
从安全角度来看,手电筒可以在遇到紧急危险时作为防身工具,用来暂时吓退潜在的威胁。
总之,手电筒应用虽看似简单,却在保障人们的生活便利、安全以及完成各种任务方面发挥着不可或缺的作用。
功能:
简单开关:用户可以通过点击应用内的按钮或图标轻松打开和关闭手电筒。
SOS 求救信号模式:按照国际通用的 SOS 求救信号节奏(三短、三长、三短)闪烁灯光,在紧急情况下可以发送求救信号。
频闪模式:以一定频率快速闪烁灯光,可用于引起注意、信号指示等场景。
电量显示:实时显示设备当前的电量状态,让用户了解剩余电量还能支持手电筒使用的时长。
低电量提醒:当设备电量低于一定阈值(如 20%)时,给用户发送提醒通知,避免突然没电影响使用。
效果
关灯 | 开灯 |
---|---|
接下来看一下,如何实现。
首先,我们需要检测设备是否支持手电筒。
使用接口
isTorchSupported
isTorchSupported(): boolean
检测设备是否支持手电筒。
系统能力: SystemCapability.Multimedia.Camera.Core
返回值:
类型 | 说明 |
---|---|
boolean | 返回 true 表示设备支持手电筒。 |
示例:
代码语言:javascript复制function isTorchSupported(cameraManager: camera.CameraManager): boolean {
let isSupported = cameraManager.isTorchSupported();
return isSupported;
}
接下来我们检测支持设置的手电筒模式。
isTorchModeSupported
isTorchModeSupported(mode: TorchMode): boolean
检测是否支持设置的手电筒模式。
系统能力: SystemCapability.Multimedia.Camera.Core
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
mode | TorchMode[1] | 是 | 手电筒模式。 |
返回值:
类型 | 说明 |
---|---|
boolean | 返回 true 表示设备支持设置的手电筒模式。 |
function isTorchModeSupported(cameraManager: camera.CameraManager, torchMode: camera.TorchMode): boolean {
let isSupported = cameraManager.isTorchModeSupported(torchMode);
return isSupported;
}
我们得到返回结果是 123,
setTorchMode
setTorchMode(mode: TorchMode): void
设置设备手电筒模式。
系统能力: SystemCapability.Multimedia.Camera.Core
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
mode | TorchMode[2] | 是 | 手电筒模式。 |
错误码:
以下错误码的详细介绍请参见Camera 错误码[3]。
错误码 ID | 错误信息 |
---|---|
7400101 | Parameter missing or parameter type incorrect. |
7400102 | Operation not allowed. |
7400201 | Camera service fatal error. |
示例:
代码语言:javascript复制import { BusinessError } from '@kit.BasicServicesKit';
function setTorchMode(cameraManager: camera.CameraManager, torchMode: camera.TorchMode): void {
try {
cameraManager.setTorchMode(torchMode);
} catch (error) {
// 失败返回错误码error.code并处理
let err = error as BusinessError;
console.error(`The setTorchMode call failed. error code: ${err.code}`);
}
}
on('torchStatusChange')
on(type: 'torchStatusChange', callback: AsyncCallback): void
手电筒状态变化回调,通过注册回调函数获取手电筒状态变化。使用 callback 异步回调。
说明
当前注册监听接口,不支持在 on 监听的回调方法里,调用 off 注销回调。
系统能力: SystemCapability.Multimedia.Camera.Core
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
type | string | 是 | 监听事件,固定为'torchStatusChange'。cameraManager 对象获取成功后可监听。目前只支持手电筒打开,手电筒关闭,手电筒不可用,手电筒恢复可用会触发该事件并返回对应信息。 |
callback | AsyncCallback | 是 | 回调函数,用于获取手电筒状态变化信息。 |
示例:
代码语言:javascript复制import { BusinessError } from '@kit.BasicServicesKit';
function callback(err: BusinessError, torchStatusInfo: camera.TorchStatusInfo): void {
if (err !== undefined && err.code !== 0) {
console.error(`Callback Error, errorCode: ${err.code}`);
return;
}
console.info(`onTorchStatusChange, isTorchAvailable: ${torchStatusInfo.isTorchAvailable}, isTorchActive: ${torchStatusInfo.isTorchActive}, level: ${torchStatusInfo.torchLevel}`);
}
function registerTorchStatusChange(cameraManager: camera.CameraManager): void {
cameraManager.on('torchStatusChange', callback);
}
off('torchStatusChange')11
off(type: 'torchStatusChange', callback?: AsyncCallback): void
手电筒状态变化注销回调,通过注销回调函数取消获取手电筒状态变化。
系统能力: SystemCapability.Multimedia.Camera.Core
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
type | string | 是 | 监听事件,固定为'torchStatusChange'。cameraManager 对象获取成功后可监听。 |
callback | AsyncCallback | 否 | 回调函数,如果指定参数则取消对应 callback(callback 对象不可是匿名函数),否则取消所有 callback。 |
示例:
代码语言:javascript复制function unregisterTorchStatusChange(cameraManager: camera.CameraManager): void {
cameraManager.off('torchStatusChange');
}
最后最关键的代码,其实就是
下面这段
代码语言:javascript复制Column() {
Button('打开手电筒', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
camera.getCameraManager(getContext() as common.UIAbilityContext).setTorchMode(1);
})
Button('关闭手电筒', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
camera.getCameraManager(getContext() as common.UIAbilityContext).setTorchMode(0);
})
}
所以大家看到了吧,其实实现一个手电筒,也没有那么难。你也可以大胆的尝试一下。这里面,我们为了方便,就把 image 换成了 button,你可以按照我上面的实现,做一下试试。
参考
https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-camera-V5
https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkui-132-V5
参考资料
[1]
TorchMode: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-camera-V5#torchmode11
[2]
TorchMode: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-camera-V5#torchmode11