HarmonyOS-鸿蒙app开发 —基于java传感器开发指导

HarmonyOS-鸿蒙app开发 —基于java传感器开发指导

场景介绍

  • 通过方向传感器数据,可以感知用户设备当前的朝向,从而达到为用户指明方位的目的。
  • 通过重力和陀螺仪传感器数据,能感知设备倾斜和旋转量,提高用户在游戏场景中的体验。
  • 通过接近光传感器数据,感知距离遮挡物的距离,使设备能够自动亮灭屏,达到防误触目的。
  • 通过气压计传感器数据,可以准确的判断设备当前所处的海拔。
  • 通过环境光传感器数据,设备能够实现背光自动调节。
  • 通过霍尔传感器数据,设备可以实现皮套功能等。

接口说明

HarmonyOS传感器提供的功能有:查询传感器的列表、订阅/取消订阅传感器数据、查询传感器的最小采样时间间隔、执行控制命令。

以订阅方向类别的传感器数据为例,本节示例涉及的接口如下:

表1 CategoryOrientationAgent的主要接口

接口名

描述

getAllSensors()

获取属于方向类别的传感器列表。

getAllSensors(int)

获取属于方向类别中特定类型的传感器列表。

getSingleSensor(int)

查询方向类别中特定类型的默认sensor(如果存在多个则返回第一个)。

setSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation, long)

以设定的采样间隔订阅给定传感器的数据。

setSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation, long, long)

以设定的采样间隔和时延订阅给定传感器的数据。

releaseSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation)

取消订阅指定传感器的数据。

releaseSensorDataCallback(ICategoryOrientationDataCallback)

取消订阅的所有传感器数据。

表2 SensorAgent的主要接口

接口名

描述

getSensorMinSampleInterval(int)

查询给定传感器的最小采样间隔。

runCommand(int, int, int)

针对某个传感器执行命令,刷新传感器的数据。

表3 CategoryEnvironmentData的主要接口

接口名

描述

getDeviceAltitude(float, float )

根据气压值获取设备所在位置的海拔高度。

GeomagneticField(float, float, float, long)

计算指定地点和时间的磁场。

obtainX()

计算地磁场的北向强度X。

obtainY()

计算地磁场的东向强度Y。

obtainZ()

计算地磁场的垂直向下强度Z。

obtainGeomagneticDip()

计算地磁场的倾斜角。

obtainDeflectionAngle()

计算地磁场的偏角。

obtainLevelIntensity()

计算地磁场的水平分量。

obtainTotalIntensity()

计算地磁场的总强度。

表4 CategoryOrientationData的主要接口

接口名

描述

getDeviceRotationMatrix(float[], float[])

根据旋转矢量获取旋转矩阵。

getDeviceOrientation(float[], float[])

根据旋转矩阵获取设备的方向。

开发步骤

权限配置

如果设备上使用了传感器权限列表中的传感器,需要请求相应的权限,开发者才能获取到传感器数据。

表5 不同敏感级别的传感器举例

敏感级别

传感器

权限名

权限描述

system_grant

加速度传感器、加速度未校准传感器、线性加速度传感器

ohos.permission.ACCELEROMETER

允许订阅Motion组对应的加速度传感器的数据。

user_grant

计步器

ohos.permission.ACTIVITY_MOTION

允许订阅运动状态。

开发者需要在config.json里面配置权限:开发者如果需要获取加速度的数据,需要进行如下权限配置。

“reqPermissions”: [

{

“name”: “ohos.permission.ACCELEROMETER”,

“reason”: “”,

“usedScene”: {

“ability”: [

“.MainAbility”

],

“when”: “inuse”

}

}

]

对于需要用户授权的权限,如计步器传感器,需要进行如下权限配置。

“reqPermissions”: [

{

“name”: “ohos.permission.ACTIVITY_MOTION”,

“reason”: “”,

“usedScene”: {

“ability”: [

“.MainAbility”

],

“when”: “inuse”

}

}

]

由于敏感权限需要用户授权,因此,开发者在应用启动时或者调用订阅数据接口前,需要调用权限检查和请求权限接口。

@Override

public void onStart(Intent intent) {

super.onStart(intent);

if (verifySelfPermission(“ohos.permission.ACTIVITY_MOTION”) != 0) {

if (canRequestPermission(“ohos.permission.ACTIVITY_MOTION”)) {

requestPermissionsFromUser(new String[] {“ohos.permission.ACTIVITY_MOTION”}, 1);

}

}

// …

}

 

@Override

public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions,

int[] grantResults) {

// 匹配requestPermissionsFromUser的requestCode

if (requestCode == 1) {

if (grantResults.length > 0 && grantResults[0] == 0) {

// 权限被授予

} else {

// 权限被拒绝

}

}

}

使用传感器

以使用方向类别的传感器为例,运动类、环境类、健康类等类别的传感器使用方法类似。

  1. 获取待订阅数据的传感器。
  2. 创建传感器回调。
  3. 订阅传感器数据。
  4. 接收并处理传感器数据。

取消订阅传感器数据。

private static final long INTERVAL = 100000000L;

 

private Button btnSubscribe;

 

private Button btnUnsubscribe;

 

private CategoryOrientationAgent categoryOrientationAgent = new CategoryOrientationAgent();

 

private ICategoryOrientationDataCallback orientationDataCallback;

 

private CategoryOrientation orientationSensor;

 

private int matrix_length = 9;

 

private int rotationVectorLength = 9;

 

@Override

public void onStart(Intent intent) {

super.onStart(intent);

super.setUIContent(ResourceTable.Layout_sensor_layout);

findComponent(rootComponent);

 

// 创建传感器回调对象。

orientationDataCallback = new ICategoryOrientationDataCallback() {

@Override

public void onSensorDataModified(CategoryOrientationData categoryOrientationData) {

// 对接收的categoryOrientationData传感器数据对象解析和使用

int dim = categoryOrientationData.getSensorDataDim(); // 获取传感器的维度信息

float degree = categoryOrientationData.getValues()[0]; // 获取方向类传感器的第一维数据

float[] rotationMatrix = new float[matrix_length];

CategoryOrientationData.getDeviceRotationMatrix(rotationMatrix, categoryOrientationData.values); // 根据旋转矢量传感器的数据获得旋转矩阵

float[] rotationAngle = new float[rotationVectorLength];

rotationAngle = CategoryOrientationData.getDeviceOrientation(rotationMatrix, rotationAngle); // 根据计算出来的旋转矩阵获取设备的方向

}

 

@Override

public void onAccuracyDataModified(CategoryOrientation categoryOrientation, int index) {

// 使用变化的精度

}

 

@Override

public void onCommandCompleted(CategoryOrientation categoryOrientation) {

// 传感器执行命令回调

}

};

 

btnSubscribe.setClickedListener(v -> {

// 获取传感器对象,并订阅传感器数据

orientationSensor = categoryOrientationAgent.getSingleSensor(

CategoryOrientation.SENSOR_TYPE_ORIENTATION);

if (orientationSensor != null) {

categoryOrientationAgent.setSensorDataCallback(

orientationDataCallback, orientationSensor, INTERVAL);

}

});

// 取消订阅传感器数据

btnUnsubscribe.setClickedListener(v -> {

if (orientationSensor != null) {

categoryOrientationAgent.releaseSensorDataCallback(

orientationDataCallback, orientationSensor);

}

});

}

 

private void findComponent(Component component) {

btnSubscribe = (Button) component.findComponentById(ResourceTable.Id_btnSubscribe);

btnUnsubscribe = (Button) component.findComponentById(ResourceTable.Id_btnUnsubscribe);

}

另外,CategoryEnvironmentData中地磁场算法相关接口的使用示例如下:

构造指定地点和时间的磁场

long timeMillis = new GregorianCalendar(2020, 1, 1).getTimeInMillis();

CategoryEnvironmentData.GeomagneticField geomagneticField = new CategoryEnvironmentData.GeomagneticField(80, 0, 0, timeMillis);

获取指定地点和时间的磁场数据

float geomagneticX = geomagneticField.obtainX();

float geomagneticY = geomagneticField.obtainY();

float geomagneticZ = geomagneticField.obtainZ();

float deflectionAngle = geomagneticField.obtainDeflectionAngle();

float geomagneticDip = geomagneticField.obtainGeomagneticDip();

float levelIntensity = geomagneticField.obtainLevelIntensity();

float totalIntensity = geomagneticField.obtainTotalIntensity();

🚀 如未找到文章请搜索栏搜素 | Ctrl+D收藏本站 | 联系邮箱:15810050733@qq.com