HarmonyOS鸿蒙Next中获取当前步数时返回in ActivateSensor, Enable sensor failed, ret:201的解决方案

HarmonyOS鸿蒙Next中获取当前步数时返回in ActivateSensor, Enable sensor failed, ret:201的解决方案

使用的是simulator HamonyOS 5.0.5(17)Bate1
代码:

getStepCount() {
  hilog.info(DOMAIN, "我的日志", "进入getStepCount()");
  let sensorCallback: (data: sensor.PedometerResponse) => void = (data: sensor.PedometerResponse) => {
    hilog.info(DOMAIN, "我的日志", "sensorCallback: steps: %{data.steps}");
    this.stepNum = data.steps ? data.steps : 0;
    this.onPedometer()
  }
  try {    
    sensor.on(sensor.SensorId.PEDOMETER, sensorCallback, { interval: 10000000 });
  } catch (err) {
    hilog.info(DOMAIN, "我的日志", '%{public}s', err);
  }
}

已申请权限:有点搞不清楚到底需要哪个,就把ACTIVITY_MOTION和ACCELEROMETER都写上了

"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET",
    "usedScene": {
      "abilities": [
        "com.example.ohosstep.MainAbility"
      ],
      "when": "always"}
  },
  {
    "name": "ohos.permission.ACTIVITY_MOTION",
    "reason": "$string:reason",
    "usedScene": {
      "abilities": [
        "FormAbility"
      ],
      "when": "always"
    },
  },
  {
    "name": "ohos.permission.ACCELEROMETER",
    "reason": "$string:reason",
    "usedScene": {
      "abilities": [
        "FormAbility"
      ],
      "when": "always"
    },
  }
]

日志错误信息:

05-10 10:44:43.946 3203-3882 C01406/OHOS::RS com.example.ohosstep I RSUIDirector::ProcessMessages messageId:1, cmdCount:1, instanceId:100000

05-10 10:44:43.969 3203-3203 C057c2/IPCObjectProxy com.example.ohosstep E SendRequest 168: failed, handle:26 error:201 desc:ISensorService proxy:5653696 time:230008549998

05-10 10:44:43.969 3203-3203 C02700/SensorServiceProxy com.example.ohosstep E in EnableSensor, Failed, ret:201

05-10 10:44:43.969 3203-3203 C02700/SensorAgentProxy com.example.ohosstep E in ActivateSensor, Enable sensor failed, ret:201

05-10 10:44:43.969 3203-3203 C02700/SensorNativeAPI com.example.ohosstep E in ActivateSensor, ActivateSensor failed

05-10 10:44:43.969 3203-3203 C02700/SensorJsAPI com.example.ohosstep E in ThrowErr, Message:SubscribeSensor fail, code:201


更多关于HarmonyOS鸿蒙Next中获取当前步数时返回in ActivateSensor, Enable sensor failed, ret:201的解决方案的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

自己搞定了,原因是除了在module.json5中静态申明外,还必须要动态申请权限。

在APP启动时调用atManager.requestPermissionsFromUser来动态申请权限,完整代码如下:

Index.ets

/*获取计步值

1、在module.json5中定义权限
2、在aboutToAppear中动态申请权限
3、调用sensor.on获取步数值

*/
import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { sensor } from '@kit.SensorServiceKit';

const DOMAIN = 0x0001;
@Entry
@Component
struct Index {
  @State message: string = '点击按钮读取步数';
  @State stepNum: number = 0;

  aboutToAppear() {
    const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
    reqPermissionsFromUser(permissions, context);
  }
  build() {
    RelativeContainer() {
      Text(this.message)
        .id('stepNum')
        .fontSize('16fp')
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
      Button('获取步数')
        .id('getStep')
        .onClick(() => {
          this.getStepCount()
          this.message = '当前步数:' + String(this.stepNum);
        }).alignRules({
        middle: { anchor: '__container__', align: HorizontalAlign.Center },
        bottom: {anchor: '__container__', align: VerticalAlign.Bottom}
      })
    }
    .height('100%')
    .width('100%')
  }
  //获取计步值
  getStepCount(){
    hilog.info(DOMAIN, "我的日志", "getStepCount()");
    try {
      sensor.on(sensor.SensorId.PEDOMETER, (data: sensor.PedometerResponse) => {
        this.stepNum = data.steps;
        hilog.info(DOMAIN, "我的日志", 'Succeeded in invoking on. Step count: ' + data.steps);
      }, { interval: 100000000 });
      setTimeout(() => {
        sensor.off(sensor.SensorId.PEDOMETER);
      }, 500);
    } catch (error) {
      let e: BusinessError = error as BusinessError;
      hilog.info(DOMAIN, "我的日志", `Failed to invoke on. Code: ${e.code}, message: ${e.message}`);
    }
  }
}

const permissions: Array<Permissions> = ['ohos.permission.ACTIVITY_MOTION'];
// 使用UIExtensionAbility:将common.UIAbilityContext 替换为common.UIExtensionContext
function reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext): void {
  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
  atManager.requestPermissionsFromUser(context, permissions).then((data) => {
    let grantStatus: Array<number> = data.authResults;
    let length: number = grantStatus.length;
    for (let i = 0; i < length; i++) {
      if (grantStatus[i] === 0) {
        // 用户授权,可以继续访问目标操作
        hilog.info(DOMAIN, "我的日志", "已获得授权");
      } else {
        // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
        hilog.info(DOMAIN, "我的日志", "未获得授权");
        return;
      }
    }
    // 授权成功
  }).catch((err: BusinessError) => {
    console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
  })
}

module.json5中添加

"requestPermissions": [
  {
    "name": "ohos.permission.ACTIVITY_MOTION",
    "reason": "$string:reason",
    "usedScene": {
      "abilities": [
        "com.example.MyStep.MainAbility"
      ],
      "when": "always"
    },
  }
]

更多关于HarmonyOS鸿蒙Next中获取当前步数时返回in ActivateSensor, Enable sensor failed, ret:201的解决方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,获取当前步数时返回“in ActivateSensor, Enable sensor failed, ret:201”错误,通常是由于传感器未正确激活或权限问题导致。首先,确保在config.json中正确声明了ohos.permission.HEALTH_DATA权限。其次,检查传感器是否在设备上可用,并确保在调用sensor.on方法时传入了正确的传感器类型和回调函数。最后,确认设备是否支持步数传感器功能。

这个错误201表明传感器启用失败,主要问题出在权限配置和模拟器环境上。以下是关键点:

  1. 权限问题:步数传感器需要ohos.permission.ACTIVITY_MOTION权限,但你的配置中该权限被分配给了FormAbility而非MainAbility。应将权限配置修改为:
{
  "name": "ohos.permission.ACTIVITY_MOTION",
  "usedScene": {
    "abilities": ["com.example.ohosstep.MainAbility"],
    "when": "always"
  }
}
  1. 模拟器限制:HarmonyOS模拟器可能不支持真实的步数传感器功能,错误201可能是模拟器环境限制导致的。建议:
  • 检查模拟器规格说明是否支持运动传感器
  • 尝试在真机设备上测试
  1. 代码优化:
  • 确保在调用sensor.on()前已动态申请权限
  • 检查interval参数值是否合理(当前10秒可能过长)
  • 添加错误回调处理

真机测试前请确保设备支持计步功能,并在设置中开启相关权限。

回到顶部