codecamp

鸿蒙OS 传感器开发指导

场景介绍

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

接口说明

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

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

接口名 描述
getAllSensors() 获取属于方向类别的传感器列表。
getAllSensors(int) 获取属于方向类别中特定类型的传感器列表。
getSingleSensor(int) 查询方向类别中特定类型的默认sensor(如果存在多个则返回第一个)。
setSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation, long) 以设定的采样间隔订阅给定传感器的数据。
setSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation, long, long) 以设定的采样间隔和时延订阅给定传感器的数据。
releaseSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation) 取消订阅指定传感器的数据。
releaseSensorDataCallback(ICategoryOrientationDataCallback) 取消订阅的所有传感器数据。
接口名 描述
getSensorMinSampleInterval(int) 查询给定传感器的最小采样间隔。
runCommand(int, int, int) 针对某个传感器执行命令,刷新传感器的数据。

开发步骤

权限配置

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

敏感级别 传感器 HarmonyOS权限名 权限描述
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) {
      switch (requestCode) {
          case 1: {
              // 匹配requestPermissionsFromUser的requestCode
              if (grantResults.length > 0 && grantResults[0] == 0) {
                  // 权限被授予
              } else {
                  // 权限被拒绝
              }
              return;
          }
      }
  }

使用传感器

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

  1. 获取待订阅数据的传感器。

  1. 创建传感器回调。

  1. 订阅传感器数据。

  1. 接收并处理传感器数据。

  1. 取消订阅传感器数据。

   private Button btnSubscribe;

    
   private Button btnUnsubscribe;

    
   private CategoryOrientationAgent categoryOrientationAgent = new CategoryOrientationAgent();

    
   private ICategoryOrientationDataCallback orientationDataCallback;

    
   private CategoryOrientation orientationSensor;

    
   private long interval = 100000000;

    
   @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]; // 获取方向类传感器的第一维数据
           }

    
           @Override
           public void onAccuracyDataModified(CategoryOrientation categoryOrientation, int i) {
               // 使用变化的精度
           }

    
           @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(Resource.Id.btnSubscribe);
       btnUnsubscribe = (Button) component.findComponentById(Resource.Id.btnUnsubscribe);
   }
鸿蒙OS 传感器概述
鸿蒙OS 控制类小器件概述
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

鸿蒙OS 开发

鸿蒙OS 术语

鸿蒙OS Java API参考

鸿蒙OS ohos.aafwk.ability

鸿蒙OS ohos.aafwk.abilityjet.activedata

鸿蒙OS ohos.aafwk.content

鸿蒙OS java.lang

鸿蒙OS java.Util

鸿蒙OS java.Util class

鸿蒙OS ohos.data.dataability

鸿蒙OS ohos.data.dataability class

鸿蒙OS ohos.agp.components

鸿蒙OS ohos.agp.components interface

鸿蒙OS ohos.agp.components class

鸿蒙OS ohos.global.configuration

鸿蒙OS java.io

鸿蒙OS ohos.data.resultset

鸿蒙OS ohos.data.resultset interface

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }