前言
- 智能手机与传统手机相比,最大的区别不仅在于它能够快速联网,还可以在户外活动时用它来进行GPS定位,指示南北方向;
- 跑步时,可以用来计步;爬山时可以显示海拔;更可以用摄像头来照相等等。
- 这些都归功于
手机内置的丰富传感器
。充分利用传感器可以发挥手机更强大的功能,促进手机App适配更多的应用领域。
目标
- 通过本章的学习,您能够了解到:
- HarmonyOS中的
传感器分类
,各种传感器的基本作用
;
- 掌握
基本传感器
如方向或运动传感器的使用方法;
- 掌握
相机组件
来拍摄图片的方法;
- 掌握
GPS传感器
获取位置信息的方法。
传感器概述
- HarmonyOS传感器是
应用访问底层硬件传感器
的一种设备抽象概念。开发者根据传感器提供的Sensor API
,可以查询设备上的传感器
,订阅传感器的数据
,并根据传感器数据定制相应的算法
,开发各类应用,比如指南针、运动健康、游戏等。
- 根据传感器的用途,可以将传感器分为
六大类
:运动类传感器、环境类传感器、方向类传感器、光线类传感器、健康类传感器、其他类传感器(如霍尔传感器),每一大类传感器包含不同类型的传感器,某种类型的传感器可能是单一的物理传感器,也可能是由多个物理传感器复合而成
。
运动类传感器
-
加速度传感器
:主要用来检测手机运动状态
,测量三个物理轴(x、y 和 z)上,施加在设备上的加速度(包括重力加速度),单位 : m/s2。
-
重力传感器
:主要用来测量重力大小
,测量三个物理轴(x、y 和 z)上,施加在设备上的重力加速度,单位 : m/s2。
-
陀螺仪传感器
:主要用来测量手机旋转的角速度
,测量三个物理轴(x、y 和 z)上,设备的旋转角速度,单位 : rad/s。
-
计步传感器
:用于提供用户行走的步数数据
,可以统计用户行走步数。
运动类传感器工作原理
主流传感器表示
- SENSOR_TYPE_ACCELEROMETER:加速度传感器;
- SENSOR_TYPE_GRAVITY:重力传感器;
- SENSOR_TYPE_GYROSCOPE:陀螺仪传感器;
- SENSOR_TYPE_PEDOMETER:计步器传感器;
- SENSOR_TYPE_AMBIENT_TEMPERATURE:环境温度传感器;
- SENSOR_TYPE_MAGNETIC_FIELD:磁场传感器。
运作机制
-
HarmonyOSOpenHarmony传感器
包含如下四个模块:Sensor API、Sensor Framework、
Sensor Service、HD_IDL层。
-
Sensor API
:提供传感器的基础API,主要包含查询传感器的列表、订阅/取消传感器的数
据、执行控制命令等,简化应用开发。
-
Sensor Framework
:主要实现传感器的订阅管理,数据通道的创建、销毁、订阅与取消
订阅,实现与SensorService的通信。
-
Sensor Service
:主要实现HD_IDL层数据接收、解析、分发,前后台的策略管控,对该
设备Sensor的管理;Sensor权限管控等。
-
HD_IDL层
:对不同的FIFO、频率进行策略选择;以及对不同设备的适配。
核心模块
接口说明
开发步骤
- 权限配置:如果设备上使用了传感器权限列表中的传感器,
需要请求相应的权限
,开发者才能获取到传感器数据。
-
开发者需要在config.json里面配置权限
:
"reqPermissions": [
{
"name": "ohos.permission.GYROSCOPE",
"reason": "",
"usedScene": {
"ability": [
".MainAbility"
],
"when": "inuse"
}
}
]
使用传感器
- 以使用
方向类别的传感器
为例,运动类、环境类、健康类等类别的传感器使用方法类似。
步骤如下:
-
获取
待订阅数据的传感器;
-
创建传感器回调
;
-
订阅
传感器数据;
-
接收并处理
传感器数据;
-
取消订阅
传感器数据。
方向传感器调用示例
- 引入方向类传感器对象
import sensor from '@system.sensor';
- 罗经数据订阅
onInit() {
sensor.subscribeCompass({
success: function(ret) {
console.log('get data direction:' + ret.direction);
},
fail: function(data, code) {
console.error('subscribe compass fail, code: ' + code + ', data: ' + data);
},
});
},
- 罗经数据取消
onDestroy() {
sensor.unsubscribeCompass();
console.log('cancel data direction collection');
}
相机调用
- 相机:
HarmonyOS相机模块
支持相机业务的开发,开发者可以通过已开放的接口实现相机硬件的访问
、操作
和新功能开发
,最常见的操作如:预览、拍照、连拍和录像等。
基本概念
-
相机静态能力
:用于描述相机的固有能力的一系列参数
,比如朝向、支持的分辨率等信息。
-
物理相机
:物理相机就是独立的实体摄像头设备
。物理相机ID
是用于标志每个物理摄像头的唯一字串
。
-
逻辑相机
:逻辑相机是多个物理相机组合出来的抽象设备
,逻辑相机通过同时控制多个物理相机设备来完成相机某些功能,如大光圈、变焦等功能。逻辑摄像机ID是一个唯一的字符串,标识多个物理摄像机的抽象能力。
-
帧捕获
:相机启动后对帧的捕获动作
统称为帧捕获。主要包含单帧捕获、多帧捕获、循环帧捕获。
主要接口
- 一个页面仅支持一个camera组件,提供预览、拍照功能。
<div class="container">
<camera flash="off" deviceposition="back"
@error="cameraError" id="take">
</camera>
<button onclick="takephotos">拍照</button>
</div>
takephotos()
{
var params={};
params.quality='high';
params.success=null;
params.fail=null;
params.complete=null;
this.$element('take').takePhoto(params)
},
camera{
width: 300px;
height: 300px;
}
位置传感器-位置能力
-
移动终端设备
已经深入人们日常生活的方方面面,如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动,都离不开定位用户终端设备的位置
。
- 当用户处于这些丰富的使用场景中时,
系统的位置能力
可以提供实时准确的位置数据
。对于开发者,设计基于位置体验的服务,也可以使应用的使用体验更贴近每个用户。
- 当应用在实现
基于设备位置的功能
时,如:驾车导航,记录运动轨迹等,可以调用该模块的API接口
,完成位置信息的获取。
基本概念
-
位置能力
用于确定用户设备在哪里
,系统使用位置坐标标示设备的位置,并用多种定位技术提供服务,如GNSS定位
、基站定位
、WLAN/蓝牙定位
(基站定位、WLAN/蓝牙定位后续统称“网络定位技术”)。通过这些定位技术,无论用户设备在室内或是户外,都可以准确地确定设备位置。
-
坐标
:系统以1984年世界大地坐标系统
为参考,使用经度、纬度数据描述地球上的一个位置;
-
GNSS定位
:基于全球导航卫星系统
,包含:GPS、GLONASS、北斗、Galileo等,通过导航卫
星,设备芯片提供的定位算法,来确定设备准确位置,定位精度高;
-
基站定位
:根据设备当前驻网基站和相邻基站的位置
,估算设备当前位置。此定位方式的定位
结果精度相对较低,并且需要设备可以访问蜂窝网络;
-
WLAN、蓝牙定位
:根据设备可搜索到的周围WLAN、蓝牙设备位置,估算设备当前位置。
运作机制
-
位置能力
作为系统为应用提供的一种基础服务,需要应用在所使用的业务场景,向系统主动发起请求
,并在业务场景结束时,主动结束此请求
,在此过程中系统会将实时的定位结果上报给应用。
-
使用设备的位置能力
,需要用户进行确认并主动开启位置开关
。如果位置开关没有开启,系统不会向任何应用提供位置服务。
-
设备位置信息属于用户敏感数据
,所以即使用户已经开启位置开关,应用在获取设备位置前仍需向用户申请位置访问权限。在用户确认允许后,系统才会向应用提供位置服务。
获取设备的位置信息
- 开发者可以
调用HarmonyOS位置相关接口
,获取设备实时位置,或者最近的历史位置。
- 对于位置敏感的应用业务,
建议获取设备实时位置信息
。如果不需要设备实时位置信息,并且希望尽可能的节省耗电,开发者可以考虑获取最近的历史位置。
接口说明
-
支持类型
geolocation.getLocation(OBJECT)
- 参数说明
开发步骤
- 应用在使用系统能力前,需要
检查是否已经获取用户授权访问设备位置信息
。如未获得授权,可以向用户申请需要的位置权限。
-
系统提供的定位权限有:
- ohos.permission.LOCATION
- ohos.permission.LOCATION_IN_BACKGROUND
-
访问设备的位置信息,必须申请ohos.permission.LOCATION权限,并且获得用户授权。
-
如果应用在后台运行时也需要访问设备位置,除需要将应用声明为允许后台运行外,还必须申请ohos.permission.LOCATION_IN_BACKGROUND权限,这样应用在切入后台之后,系统可以继续上报位置信息。
-
开发者可以在应用config.json文件中声明所需要的权限
,示例代码如下:
{
"reqPermissions": [{
"name": "ohos.permission.LOCATION",
"reason": "$string:reason_description",
"usedScene": {
"ability":
["com.myapplication.LocationAbility"],
"when": "inuse"
}, {
...
}
]
}
- 为了使用位置传感器,需要引入头文件system.geolocation’,获取位置管理对象geolocation’。
import geolocation from '@system.geolocation';
- 在页面初始化回调函数或自定义函数中调用该对象的方法getLocation来获取位置信息
onInit(){
geolocation.getLocation({
success: function (data) {
console.log('success get location data. latitude:' +data.latitude);},
fail: function (data, code) {
console.log('fail to get location. code:' + code + ', data:' + data);
},
}) }
本章总结
- 了解HarmonyOS设备上丰富的传感器设备,
- 掌握基本的传感器工作原理
- 能够调用常用传感器完成特定场景应用开发。
data. latitude:’ +data.latitude);},
fail: function (data, code) {
console.log(‘fail to get location. code:’ + code + ‘, data:’ + data);
},
}) }
# 本章总结
* 了解HarmonyOS设备上丰富的传感器设备,
* 掌握基本的传感器工作原理
* 能够调用常用传感器完成特定场景应用开发。