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
自己搞定了,原因是除了在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表明传感器启用失败,主要问题出在权限配置和模拟器环境上。以下是关键点:
- 权限问题:步数传感器需要
ohos.permission.ACTIVITY_MOTION
权限,但你的配置中该权限被分配给了FormAbility而非MainAbility。应将权限配置修改为:
{
"name": "ohos.permission.ACTIVITY_MOTION",
"usedScene": {
"abilities": ["com.example.ohosstep.MainAbility"],
"when": "always"
}
}
- 模拟器限制:HarmonyOS模拟器可能不支持真实的步数传感器功能,错误201可能是模拟器环境限制导致的。建议:
- 检查模拟器规格说明是否支持运动传感器
- 尝试在真机设备上测试
- 代码优化:
- 确保在调用sensor.on()前已动态申请权限
- 检查interval参数值是否合理(当前10秒可能过长)
- 添加错误回调处理
真机测试前请确保设备支持计步功能,并在设置中开启相关权限。