HarmonyOS学习第19天:感知世界的 “超能力”,HarmonyOS 传感器揭秘

发布于:2025-03-13 ⋅ 阅读:(20) ⋅ 点赞:(0)

引言

在智能设备的奇妙世界里,传感器就如同人类的感官,赋予设备感知周围环境的能力。HarmonyOS 设备配备了丰富多样的传感器,它们是设备与外界交互的关键桥梁,让设备能够 “看” 到光线的变化、“感受” 到运动的状态、“察觉” 到周围的温度和湿度等。

想象一下,你的手机能够自动调节屏幕亮度,适应不同的光线环境,这背后就是光线传感器在发挥作用;而当你玩一些体感游戏时,手机或平板能够精准地捕捉你的动作,靠的则是加速度传感器和陀螺仪传感器。这些传感器不仅提升了设备的智能程度,也极大地丰富了我们的使用体验 ,下面我们就来认识一些 HarmonyOS 设备上常见的传感器。

HarmonyOS 传感器大赏

运动类传感器

运动类传感器主要用于感知设备的运动状态,包括加速度传感器、陀螺仪传感器、重力传感器等。加速度传感器基于牛顿第二定律设计,通过检测物体加速度来感知设备的运动状态。在手机中,它能检测手机的晃动、倾斜等动作,常见应用场景如手机摇一摇功能,通过检测加速度的变化来触发相应操作 ;在计步器中,利用加速度传感器监测人行走时的加速度变化,从而计算步数。陀螺仪传感器则是利用陀螺效应,通过测量物体的角速度来感知设备的旋转运动,常用于体感游戏,精准捕捉玩家操作时设备的旋转和倾斜,使玩家获得更沉浸式的游戏体验;在无人机飞行控制中,帮助稳定飞行姿态,实现精准飞行。重力传感器主要测量重力加速度,能感知设备的方向和倾斜角度,例如在自动横竖屏切换功能中,根据重力传感器检测到的设备方向变化,自动调整屏幕显示方向。

环境类传感器

环境类传感器用于感知周围环境的物理量,包括光线传感器、温度传感器、湿度传感器、气压传感器等。光线传感器能感知环境光的强度,通过检测环境光强度,手机屏幕可自动调节亮度,在强光下提高亮度以便看清屏幕内容,在弱光下降低亮度以节省电量和保护眼睛 ,还常用于智能照明系统,根据环境光线自动开关灯或调节亮度。温度传感器基于热胀冷缩、热敏电阻等原理,用于测量环境温度,在智能家居中,协助空调、地暖等设备自动调节室内温度,维持舒适环境 ;在工业生产中,对一些对温度要求严格的工艺流程进行实时监测和控制。湿度传感器通过检测空气中水蒸气含量来确定湿度,在农业领域,帮助农民监测土壤湿度,合理安排灌溉,提高农作物产量;在博物馆、图书馆等场所,用于监测环境湿度,保护文物和书籍不受潮湿影响。气压传感器用于测量大气压力,可通过气压变化计算海拔高度,在户外运动应用中,为登山爱好者提供海拔信息,帮助他们了解自己所处位置的高度 ;还能用于天气预报,通过监测气压变化预测天气情况。

其他实用传感器

除了上述两类传感器,HarmonyOS 设备还有方向传感器、心率传感器、霍尔传感器、接近光传感器等。方向传感器结合地磁传感器和加速度传感器的数据,通过复杂算法计算出设备的朝向,为用户提供准确的方向信息,广泛应用于导航软件,让用户清晰了解行进方向。心率传感器利用光电容积脉搏波(PPG)技术,通过发射特定波长的光并检测反射光的变化,计算出心率,常见于智能手环、智能手表等可穿戴设备,帮助用户实时监测心率,关注健康状况 。霍尔传感器基于霍尔效应,检测磁场变化,在翻盖手机中,实现开盖自动亮屏、合盖自动锁屏功能 ;在电动车的电机控制系统中,用于检测电机的转速和位置,实现精准控制。接近光传感器通过发射红外线并检测反射回来的红外线强度,判断物体的接近程度,当手机贴近面部接听电话时,自动关闭屏幕,防止误操作,同时节省电量 。

开启感知之旅:使用 Sensor API 获取数据

了解了 HarmonyOS 设备上的各种传感器后,接下来我们要学习如何使用传感器 API 来获取这些传感器的数据,并让这些数据为我们的应用增添更多精彩功能。在 HarmonyOS 中,访问传感器数据的过程并不复杂,只需要遵循一定的步骤和规范 。

权限申请

在获取传感器数据之前,我们首先需要在 config.json 配置文件中申请相应的权限。这是确保应用安全和用户隐私的重要步骤。不同类型的传感器需要不同的权限,例如,要使用加速度传感器,我们需要申请 ohos.permission.ACCELEROMETER 权限;若要使用光线传感器,需申请 ohos.permission.LIGHT 权限。以申请加速度传感器权限为例,在 config.json 文件中的 “reqPermissions” 数组中添加如下内容:

"reqPermissions": [

    {

        "name": "ohos.permission.ACCELEROMETER",

        "reason": "应用需要获取加速度数据,以实现相关功能",

        "usedScene": {

            "ability": [".MainAbility"],

            "when": "inuse"

        }

    }

]

其中,“name” 字段指定权限名称;“reason” 字段用于向用户解释申请该权限的原因;“usedScene” 字段则描述了权限的使用场景,包括在哪些 Ability 中使用以及使用时机(“inuse” 表示在使用相关功能时申请) 。

基本操作

获取传感器列表:通过调用 sensor.getSensorList () 方法,可以获取设备支持的所有传感器的参数。这对于了解设备具备哪些传感器以及它们的特性非常有帮助。例如:

import { sensor } from '@ohos.sensor';

import { BusinessError } from '@ohos.base';

sensor.getSensorList((error: BusinessError, data: Array<sensor.Sensor>) => {

    if (error) {

        console.info('获取传感器列表失败: ', error);

    } else {

        console.info('获取传感器列表成功');

        for (let i = 0; i < data.length; i++) {

            console.info('传感器信息: ', JSON.stringify(data[i]));

        }

    }

});

上述代码中,通过回调函数获取传感器列表数据,如果获取过程中出现错误,会在控制台打印错误信息;若成功获取,则遍历打印每个传感器的详细信息 。

2. 订阅和取消订阅传感器数据:要获取传感器的实时数据,我们需要订阅传感器。使用 sensor.on () 方法可以实现对传感器的持续监听,当传感器数据发生变化时,会触发相应的回调函数。例如,订阅加速度传感器数据:

sensor.on(sensor.SensorId.ACCELEROMETER, (data: sensor.AccelerometerResponse) => {

    console.info('成功获取加速度数据. x: ', data.x, ' y: ', data.y, ' z: ', data.z);

}, { interval: 100000000 });

上述代码中,第一个参数指定传感器类型为加速度传感器;第二个参数是回调函数,用于处理接收到的传感器数据;第三个参数是一个配置对象,这里设置了传感器数据上报周期为 100000000 纳秒(即 100 毫秒) 。当不再需要获取传感器数据时,应调用 sensor.off () 方法取消订阅,以释放资源,如:

sensor.off(sensor.SensorId.ACCELEROMETER);

设置采样周期:不同传感器支持的采样周期范围不同,我们可以在订阅传感器时通过配置参数来设置采样周期。设置数值越小,数据上报越频繁,但同时功耗也越大。例如,上述订阅加速度传感器数据的代码中,将采样周期设置为 100000000 纳秒,这个值应根据实际需求和设备性能进行合理调整 。

代码示例

下面给出加速度传感器、陀螺仪传感器和光线传感器获取数据的完整代码示例及代码解释:

加速度传感器

import { sensor } from '@ohos.sensor';

import { BusinessError } from '@ohos.base';

// 获取传感器列表

sensor.getSensorList((error: BusinessError, data: Array<sensor.Sensor>) => {

    if (error) {

        console.info('获取传感器列表失败: ', error);

    } else {

        console.info('获取传感器列表成功');

        for (let i = 0; i < data.length; i++) {

            console.info('传感器信息: ', JSON.stringify(data[i]));

        }

    }

});

// 订阅加速度传感器数据

sensor.on(sensor.SensorId.ACCELEROMETER, (data: sensor.AccelerometerResponse) => {

    console.info('成功获取加速度数据. x: ', data.x, ' y: ', data.y, ' z: ', data.z);

}, { interval: 100000000 });

// 取消订阅加速度传感器数据(可在适当时候调用,如页面销毁时)

// sensor.off(sensor.SensorId.ACCELEROMETER);

代码解释:首先导入所需的模块,然后通过 getSensorList 方法获取传感器列表并打印相关信息。接着使用 on 方法订阅加速度传感器数据,当有新数据时,在控制台打印加速度在 x、y、z 轴上的值。最后,如果需要停止获取数据,可以调用 off 方法取消订阅 。

陀螺仪传感器

import { sensor } from '@ohos.sensor';

import { BusinessError } from '@ohos.base';

// 订阅陀螺仪传感器数据

sensor.on(sensor.SensorId.GYROSCOPE, (data: sensor.GyroscopeResponse) => {

    console.info('成功获取陀螺仪数据. x: ', data.x, ' y: ', data.y, ' z: ', data.z);

}, { interval: 150000000 });

// 取消订阅陀螺仪传感器数据(可在适当时候调用)

// sensor.off(sensor.SensorId.GYROSCOPE);

代码解释:导入模块后,直接使用 on 方法订阅陀螺仪传感器数据,设置数据上报周期为 150000000 纳秒。当接收到陀螺仪数据时,在控制台打印其在 x、y、z 轴上的旋转角速度值。同样,可在不需要数据时调用 off 方法取消订阅 。

光线传感器

import { sensor } from '@ohos.sensor';

import { BusinessError } from '@ohos.base';

// 订阅光线传感器数据

sensor.on(sensor.SensorId.AMBIENT_LIGHT, (data: sensor.AmbientLightResponse) => {

    console.info('成功获取光线传感器数据. 光照强度: ', data.light);

}, { interval: 200000000 });

// 取消订阅光线传感器数据(可在适当时候调用)

// sensor.off(sensor.SensorId.AMBIENT_LIGHT);

代码解释:导入模块后,通过 on 方法订阅光线传感器数据,设置采样周期为 200000000 纳秒。当获取到光线传感器数据时,在控制台打印当前环境的光照强度值。若要停止获取数据,调用 off 方法取消订阅 。

用数据赋能应用:基于传感器数据的功能实现

通过传感器 API 获取到数据后,我们就可以充分发挥想象力,利用这些数据为应用实现各种有趣和实用的功能。下面为大家介绍几个基于传感器数据实现的常见应用功能 。

摇一摇功能

摇一摇功能在很多应用中都深受用户喜爱,它为用户带来了独特的交互体验。在 HarmonyOS 中,实现摇一摇功能主要基于加速度传感器。其实现逻辑是通过检测设备在 x、y、z 三个方向上加速度的变化,当加速度的变化超过一定阈值时,判定为一次有效摇动 。具体实现步骤如下:

设置阈值:定义一个用于判断是否有效晃动的阈值加速度 criticalSpeed ,比如设置为 20(可根据实际需求调整)。当 x^2 + y^2 + z^2 > criticalSpeed^2 时,此次晃动属于有效晃动 。

记录时间戳和晃动次数:第一次有效晃动时记录时间戳,定义有效晃动次数,当达到有效晃动次数(如 3 次)时,判断时间戳减去第一次记录的时间戳是否在规定时间内(如 600 毫秒),若在规定时间内,则摇一摇完成,触发相关方法 。

以下是一个简单的摇一摇功能实现代码示例:

import { sensor } from '@ohos.sensor';

import { promptAction } from '@ohos.ability';

class WaggleHandle {

    // 加速度阈值,当设备加速度总和超过此阈值时视为有效摇动

    private readonly criticalSpeed = 20;

    // 加速度传感器监听间隔

    private readonly shakeIntervalThreshold = 200;

    // 连续有效摇动次数计数

    private shakeCount: number = 0;

    // 需要连续的有效摇动次数才能触发事件

    private maxShakeCount: number = 3;

    // 第一次有效摇动时间戳

    private firstTime: number = 0;

    // 最短间隔时间

    private shakeTime: number = 600;

    shakeStatus(accelerometerData: sensor.AccelerometerResponse) {

        const currentTime = Date.now();

        // 计算设备加速度总和的平方

        const totalAcceleration = Math.pow(accelerometerData.x, 2) + Math.pow(accelerometerData.y, 2) + Math.pow(accelerometerData.z, 2);

        if (totalAcceleration > Math.pow(this.criticalSpeed, 2)) {

            // 记录第一次有效摇动时间

            this.firstTime ||= currentTime;

            if (this.shakeTime >= currentTime - this.firstTime) {

                this.shakeCount++;

                // 摇一摇成功重置次数和第一次有效摇动时间

                if (this.shakeCount === this.maxShakeCount) {

                    this.shakeCount = 0;

                    this.firstTime = 0;

                    return true;

                }

                return false;

            } else {

                // 超出规定间隔时间,重置次数和第一次有效摇动时间

                this.shakeCount = 0;

                this.firstTime = 0;

                return false;

            }

        } else {

            return false;

        }

    }

    init() {

        try {

            // 监听加速度传感器

            sensor.on(sensor.SensorId.ACCELEROMETER, (data: sensor.AccelerometerResponse) => {

                if (this.shakeStatus(data)) {

                    promptAction.showToast({ message: '用户进行了摇一摇操作' });

                }

            }, { interval: this.shakeIntervalThreshold * 1000000 });

        } catch (error) {

            console.info(JSON.stringify(error));

        }

    }

}

// 使用示例

const waggle = new WaggleHandle();

waggle.init();

计步器应用

计步器应用是运动健康类应用中的常见功能,它利用计步传感器获取用户行走的步数数据,并展示给用户。在 HarmonyOS 中,实现计步器应用主要通过订阅计步器传感器来获取数据 。实现方法如下:

申请权限:在 config.json 文件中申请 ohos.permission.ACTIVITY_MOTION 权限,这是使用计步传感器的必要权限 。

订阅计步器传感器:通过调用 sensor.on (sensor.SensorId.PEDOMETER, callback, options) 方法订阅计步器传感器数据,其中 callback 是数据回调函数,当有新的计步数据时会触发该函数;options 可设置数据上报周期等参数 。

数据处理和展示:在回调函数中获取步数数据,并进行处理(如累加步数、计算运动距离等),然后将处理后的数据展示在应用界面上,供用户查看 。

以下是一个简单的计步器应用代码示例:

import { sensor } from '@ohos.sensor';

import { abilityAccessCtrl } from '@ohos.abilityAccessCtrl';

const CommonConstants = {

    REQUEST_PERMISSIONS: ['ohos.permission.ACTIVITY_MOTION'],

    OLD_STEPS: 'oldSteps',

    CURRENT_STEPS: 'currentSteps',

    PROGRESS_VALUE_TAG: 'progressValue',

    SENSOR_INTERVAL: 100000000 // 100毫秒

};

class HomePage {

    private isStart: boolean = true;

    private oldSteps: string = '';

    private currentSteps: string = '0';

    private progressValue: number = 0;

    constructor() {

        this.requestPermissions();

    }

    requestPermissions(): void {

        let atManager = abilityAccessCtrl.createAtManager();

        try {

            atManager.requestPermissionsFromUser(this.context, CommonConstants.REQUEST_PERMISSIONS).then((data) => {

                if (data.authResults[0]!== 0 || data.authResults[1]!== 0) {

                    return;

                }

                const that = this;

                try {

                    sensor.on(sensor.SensorId.PEDOMETER, (data) => {

                        try {

                            if (that.isStart) {

                                if (!that.oldSteps) {

                                    that.oldSteps = data.steps.toString();

                                    // 这里可以使用本地存储工具类来存储步数,示例中简化为直接赋值

                                    // StepsUtil.putStorageValue(CommonConstants.OLD_STEPS, that.oldSteps);

                                } else {

                                    that.currentSteps = (data.steps - parseInt(that.oldSteps, 10)).toString();

                                }

                            } else {

                                that.currentSteps = data.steps.toString();

                            }

                            // 这里可以添加逻辑,根据步数计算运动距离等信息并展示

                            // 示例中仅展示步数

                            console.info('当前步数: ', that.currentSteps);

                        } catch (err) {

                            console.error('Sensor on err', JSON.stringify(err));

                        }

                    }, { interval: CommonConstants.SENSOR_INTERVAL });

                } catch (err) {

                    console.error('订阅计步器传感器失败', JSON.stringify(err));

                }

            }).catch((error) => {

                console.error('请求权限失败', JSON.stringify(error));

            });

        } catch (error) {

            console.error('创建权限管理对象失败', JSON.stringify(error));

        }

    }

}

// 使用示例

const homePage = new HomePage();

屏幕亮度自动调节

屏幕亮度自动调节功能能够根据环境光线的变化自动调整屏幕亮度,为用户提供舒适的视觉体验,同时还能节省电量。在 HarmonyOS 中,实现该功能主要依据光线传感器的数据 。其原理和实现思路如下:

获取光线传感器数据:通过订阅光线传感器,获取环境光强度数据。光线传感器会实时检测周围环境的光线强度,并将数据返回给应用 。

设定亮度调节算法:根据获取到的光线强度数据,结合预设的亮度调节算法来计算出合适的屏幕亮度值。例如,可以设定一个光线强度与屏幕亮度的映射关系,当光线强度较高时,屏幕亮度相应提高;光线强度较低时,屏幕亮度降低 。

设置屏幕亮度:将计算得到的屏幕亮度值应用到设备屏幕上,实现屏幕亮度的自动调节。在 HarmonyOS 中,可以通过相关的系统 API 来设置屏幕亮度 。

以下是一个简单的屏幕亮度自动调节功能实现思路的代码示例(假设存在设置屏幕亮度的方法 setScreenBrightness):

import { sensor } from '@ohos.sensor';

// 订阅光线传感器数据

sensor.on(sensor.SensorId.AMBIENT_LIGHT, (data: sensor.AmbientLightResponse) => {

    // 假设这里有一个根据光线强度计算屏幕亮度的函数calculateBrightness

    const brightness = calculateBrightness(data.light);

    // 调用设置屏幕亮度的方法

    setScreenBrightness(brightness);

}, { interval: 200000000 });

function calculateBrightness(lightIntensity: number): number {

    // 简单的亮度调节算法示例,根据实际需求调整

    if (lightIntensity < 100) {

        return 0.1; // 低亮度

    } else if (lightIntensity < 500) {

        return 0.5; // 中等亮度

    } else {

        return 1.0; // 高亮度

    }

}

function setScreenBrightness(brightness: number) {

    // 这里应替换为实际设置屏幕亮度的代码,示例中为占位

    console.info('设置屏幕亮度为: ', brightness);

}

通过以上几个示例,我们可以看到,利用 HarmonyOS 提供的传感器 API 和丰富的传感器资源,能够轻松实现各种基于传感器数据的应用功能,为用户带来更加智能、便捷和有趣的使用体验 。在实际开发中,我们可以根据应用的具体需求,灵活运用传感器数据,创造出更多富有创意和实用价值的功能 。

总结与展望

在 HarmonyOS 的世界里,传感器开发为我们打开了一扇通往智能交互新境界的大门。通过对各种传感器的认识,我们了解到它们是如何如同敏锐的触角,让设备感知周围的环境变化;而使用 Sensor API 获取数据的过程,虽然涉及一些权限申请和代码操作,但只要掌握了正确的方法,就能轻松获取丰富的传感器数据。

基于这些数据实现的各种应用功能,不仅展示了传感器开发的无限潜力,也为用户带来了更加便捷、有趣和智能的体验。摇一摇功能的趣味互动、计步器应用的健康关怀、屏幕亮度自动调节的贴心设计,这些只是冰山一角,随着技术的不断发展和开发者的深入探索,相信还会有更多创新的应用场景和功能被挖掘出来 。

对于开发者而言,HarmonyOS 的传感器开发是一个充满机遇和挑战的领域。我们可以充分利用 HarmonyOS 强大的系统能力和丰富的 API,结合自己的创意和技术,为用户打造出独一无二的应用体验 。同时,也期待更多的开发者能够加入到 HarmonyOS 的生态建设中来,共同探索传感器开发的更多可能性,为万物互联的智能时代贡献自己的力量 。让我们携手共进,用代码和创意,让设备更加智能,让生活更加美好 。