新闻详情

新闻详情

首页 / 资讯中心 / 详情

Flutter for OpenHarmony 实战:三方库 environment_sensors 的鸿蒙化适配指南

发布时间:2026/9/28 20:25:25来源:尧图网络
Flutter for OpenHarmony 实战:三方库 environment_sensors 的鸿蒙化适配指南
环境搭建指引https://atomgit.com/CPF-Flutter/flutter_samples/blob/master/ohos/getting-started/flutter-oh-env-setup.mdenvironment_sensors把设备的四类环境传感器封成四条 Dart 流环境温度、相对湿度、环境光、气压另外提供一个这个传感器到底有没有的可用性查询。它的 0.3.0 版支持 Android、iOS没有 OpenHarmony。它在鸿蒙适配里暴露了一个非常本质的问题“同一个传感器两家平台的编号不一样”。上游 Dart 直接把安卓的Sensor.TYPE_*常量13 / 12 / 5 / 6发给原生而鸿蒙的sensor.SensorId里 13 是湿度、8 是气压——照抄数字会订到完全不相干的传感器。这个坑不靠翻译表是躲不过去的。适配对象上游environment_sensors0.3.0MIT适配产物 TAG0.3.0-ohos-1.0.0-beta.1。一、这个库要解决什么1.1 上游 APIfinalsensorsEnvironmentSensors();// 可用性finalbool hasTempawaitsensors.getSensorAvailable(SensorType.AmbientTemperature);// 四条流拿到的是 doublesensors.temperature.listen((v)print(温度$v));sensors.humidity.listen((v)print(湿度$v));sensors.light.listen((v)print(光照$v));sensors.pressure.listen((v)print(气压$v));1.2 契约一条方法通道 四条事件通道const_methodChannelMethodChannel(environment_sensors/method);const_temperatureEventChannelEventChannel(environment_sensors/temperature);const_humidityEventChannelEventChannel(environment_sensors/humidity);const_lightEventChannelEventChannel(environment_sensors/light);const_pressureEventChannelEventChannel(environment_sensors/pressure);// 注意参数是裸数字位置参数不是 mapFutureboolgetSensorAvailable(SensorTypet){if(tSensorType.AmbientTemperature)return_methodChannel.invokeMethod(isSensorAvailable,13);if(tSensorType.Humidity)return_methodChannel.invokeMethod(isSensorAvailable,12);if(tSensorType.Light)return_methodChannel.invokeMethod(isSensorAvailable,5);if(tSensorType.Pressure)return_methodChannel.invokeMethod(isSensorAvailable,6);returnfalse;}// 四条流都用 double.parse(event.toString())_temperatureEvents_temperatureEventChannel.receiveBroadcastStream().map((event)double.parse(event.toString()));两个细节决定了适配的形状isSensorAvailable传的是安卓常量13/12/5/6且是位置参数事件通道必须送能double.parse的值鸿蒙侧要送数字编码成 FLOAT64不能送字符串。Dart 层没有平台门pubspec.yaml只声明 android / ios。1.3 基线node.agents/tools/tree-diff.mjs _probe/cand14/environment_sensors _probe/es_work# 相同: 78 内容不同: 0 仅 B 有: .gitignore / .metadata 等工程文件上游master6d6ba7e与 pub.dev 上的 0.3.0 一致。二、选库四道筛 在线查重筛子检查结果① pub.dev 平台列表有ohos吗[android, ios]→ 需要适配② 兄弟包lib_ohos/ pub.dev 上environment_sensors_ohos都没有③ Dart 平台门Platform.is*/defaultTargetPlatform无④ 依赖体检dep-ohos-check.mjs environment_sensorsdeps ok: -零依赖在线查重831 个组织仓库快照精确匹配---- environment_sensors干净。同轮被排除的ambient_lighthxa-flutter 已适配。三、六步适配流程建仓 → 2. 克隆_probe/es_work→ 3. 建分支feat/ohos_environment_sensors_0.3.0并flutter create -t plugin --platforms ohos .→ 4. 写实现 → 5. 补三份文档 根 README 示例改自检台 → 6. 推送并打 TAG0.3.0-ohos-1.0.0-beta.1。四、代码写在哪个文件ohos/src/main/ets/components/plugin/EnvironmentSensorsPlugin.ets # 本篇唯一新增的实现文件4.1 关键点一安卓编号 ≠ 鸿蒙编号必须做翻译表传感器安卓常量鸿蒙sensor.SensorId环境温度13AMBIENT_TEMPERATURE260相对湿度12HUMIDITY13环境光5AMBIENT_LIGHT 5气压6BAROMETER8ANDROID_TO_OHOS_SENSOR.set(13,sensor.SensorId.AMBIENT_TEMPERATURE);ANDROID_TO_OHOS_SENSOR.set(12,sensor.SensorId.HUMIDITY);ANDROID_TO_OHOS_SENSOR.set(5,sensor.SensorId.AMBIENT_LIGHT);ANDROID_TO_OHOS_SENSOR.set(6,sensor.SensorId.BAROMETER);不翻译会怎样安卓的温度 13在鸿蒙是湿度安卓的气压 6在鸿蒙是计步之类完全无关的传感器——订阅上去不报错但拿到的是错的数据。这种静默错误最难查。isSensorAvailable的参数是裸数字实现里两种形态都兼容constraw:Object|nullcall.args;if(typeofrawnumber)returnrawasnumber;// 位置参数constmaprawasMapstring,Object;// 兼容 {type: n}constvaluemap.get?.(type);4.2 关键点二sensor.on/off的每个重载都要求字面量枚举这样写编译不过sensor.on(this.sensorId,(r)…);// No overload matches this call因为每个重载都把类型写成具体字面量SensorId.AMBIENT_LIGHT、SensorId.BAROMETER…传一个SensorId变量匹配不上任何一个。解决办法是在四个闭包里各自写死字面量交给同一个 handler 调度addChannel(LIGHT_CHANNEL,(emit){sensor.on(sensor.SensorId.AMBIENT_LIGHT,(r:sensor.LightResponse)emit(r.intensity));},(){sensor.off(sensor.SensorId.AMBIENT_LIGHT);});四条流各自取自己的字段AmbientTemperatureResponse.temperature/HumidityResponse.humidity/LightResponse.intensity/BarometerResponse.pressure。4.3 关键点三可用性判断就是真的去解析一次鸿蒙没有SensorManager.getDefaultSensor(type) ! null的直接写法但sensor.getSingleSensorSync(id)在传感器不存在时会抛异常try{constfoundsensor.getSingleSensorSync(sensorId);Log.i(TAG,sensor found: name${found.sensorName}id${found.sensorId});returntrue;}catch(error){Log.w(TAG,sensor${sensorId}unavailable:${(errorasBusinessError).message});returnfalse;}4.4 事件频率与日志系统回调频率由sensor.on的 options 决定本实现不传 options为避免 hilog 被冲爆每 20 条才打一行日志Dart 侧拿到的仍是全部事件不节流。五、真机模拟器验证示例是自检台一个重新查询四种传感器是否可用按钮 每种传感器一个订阅/退订按钮界面显示可用性与已收事件数日志前缀[ES-CHECK]原生日志按EnvironmentSensorsPlugin过滤。项值设备Pura 90模拟器HarmonyOS 6.1.1(24) / API 24ohos-x64操作设备侧结果getSensorAvailable(AmbientTemperature)安卓 13isSensorAvailable(android type 13) - false日志sensor 260 unavailable: The sensor is not supported by the device.getSensorAvailable(Humidity)安卓 12isSensorAvailable(android type 12) - falsegetSensorAvailable(Light)安卓 5sensor found: namelight id5→isSensorAvailable(android type 5) - truegetSensorAvailable(Pressure)安卓 6isSensorAvailable(android type 6) - false日志sensor 8 unavailable: …鸿蒙气压 id 是8订阅环境光sensor listening started随后sensor event #1 0、#21 0、#41 0…该模拟器光感默认读数 0注入光照后数值变化devecocli emulator sensor --target Pura 90 --light-intensity 30000之后下一条事件变成sensor event #81 30000三个不可用的传感器不产生任何事件getSingleSensorSync抛异常 → 界面显示不可用最后一条是本次验证里最有说服力的一步注入 → 事件值变化证明事件通道推的是真实传感器数据而不是常量或缓存。API 26HarmonyOS 7.0.0 Beta2上的差异重要在最新模拟器Pura X ViewAPI 26上复测时发现可用性判定一致sensor found: namelight id5→isSensorAvailable(android type 5) - true其余三种为false但订阅失败sensor.on failed code401 messageThe parameter invalid.也就是说同一份代码在API 24 上能订阅成功并收到数据在API 26 上sensor.on直接报 401参数错误。这属于跨版本行为差异不是没跑通getSingleSensorSync证明传感器在、sensor.on在 API 26 上需要不同/额外的参数大概率要显式传Options例如采样间隔。这一点已如实记录修复与复试安排在下一轮改带Options的调用并在失败时保留原调用作为回退。验证环境说明完整验证在 API 24Pura 90完成API 26Pura X View7.0.0 Beta2上完成了可用性复测并发现上述 401 差异。该 Beta 镜像在本机存活窗口只有 20–60 秒故采用一窗口一应用 断点续传的方式取证。六、编译与构建踩坑6.1No overload matches this call两次第一次是sensor.on/off传变量见 4.2修完后还有一次根因相同——SDK 里这类按枚举成员重载的 API 都不接受变量。遇到这个报错先想是不是该把字面量写进闭包。6.2 示例侧上游示例把_tempAvailable用来判断湿度流、_humidityAvailable判断温度流上游自身的笔误鸿蒙示例改成每种传感器各自判断、各自订阅flutter create生成的lib/environment_sensors_method_channel.dart、lib/environment_sensors_platform_interface.dart、test/environment_sensors_method_channel_test.dart、example/**/*.kts、example/integration_test/、ios/Classes/EnvironmentSensorsPlugin.swift等全部删除本库不是联邦式插件上游只有一个 Dart 文件。七、已知限制只映射上游暴露的四种传感器其它 id 一律返回falseAPI 26 上sensor.on报 401见第五节修复前应以 API 24 为准回调频率由系统决定插件只对日志做节流不对数据节流示例的可用性/订阅逻辑已按每种传感器独立重写与上游示例的写法不同上游存在笔误。八、常见问题Q1为什么不直接拿 Dart 传来的数字去sensor.on因为两家编号体系不同见 4.1 表格。鸿蒙的 13 是湿度、8 是气压直接传会订到无关传感器——不报错但数据全错是最难查的一类问题。Q2isSensorAvailable的参数为什么是裸数字上游 Dart 就是这么写的invokeMethod(isSensorAvailable, 13)。第二个位置参数会被编码成数字而不是 map实现里必须兼容这种形态。Q3鸿蒙有没有列出所有可用传感器的接口有getSensorListSync但本库只需要某一个在不在用getSingleSensorSync更直接而且它抛异常的行为正好可以当判据。Q4为什么事件值要送数字而不是字符串上游 Dart 是double.parse(event.toString())。送数字会编码成 FLOAT64toString()后形如0.0/30000.0能正常解析送字符串虽也能解析但不如数字直接、也避免精度/格式歧义。Q5光照为什么一直是 0这台模拟器的光感默认读数就是 0漆黑档。用devecocli emulator sensor --target 实例名 --light-intensity N注入即可看到数值变化实测 30000。Q6其它三种传感器为什么不可用模拟器只虚拟了光感。可用性判定如实返回false正是它该有的行为——不要把没有传感器实现成返回 0那会让调用方误判。Q7API 26 的 401 会影响使用吗在 API 26 设备上目前会影响订阅可用性查询正常。修复方向是显式传Options在 API 24 上功能完整。Q8需要声明权限吗读取这些环境传感器不需要权限声明。九、本篇用到的库项值适配仓库https://atomgit.com/oh-flutter/environment_sensors上游仓库https://github.com/nhandrew/environment_sensors上游版本0.3.0MITmaster6d6ba7e与发布版逐文件一致适配 TAG0.3.0-ohos-1.0.0-beta.1适配分支feat/ohos_environment_sensors_0.3.0通道方法通道environment_sensors/method事件通道…/temperature、…/humidity、…/light、…/pressure鸿蒙侧依赖kit.SensorServiceKitsensor.getSingleSensorSync/sensor.on/sensor.offdependencies:environment_sensors:git:url:https://atomgit.com/oh-flutter/environment_sensors.gitref:0.3.0-ohos-1.0.0-beta.1验证环境项值Flutter for OpenHarmony SDK3.44.9ohos-0.0.1-canary1Dart 3.12.2DevEco Studio26.0.0.621设备Pura 90模拟器HarmonyOS 6.1.1(24) / API 24ohos-x64完整验证Pura X ViewHarmonyOS 7.0.0(26.0.0) Beta2 / API 26可用性复测构建产物example/build/ohos/hap/entry-default-signed.hap复现命令$env:PUB_CACHE E:\pub-cachecd _probe/es_work/example/ohos devecocli signature generate# 首次需要提交前清空 signingConfigscd..flutter build hap--debug--target-platform ohos-x64 hdc install-r build/ohos/hap/entry-default-signed.hap hdc shell aastart-a EntryAbility-b com.julow.environment_sensors_example# 1) 点重新查询四种传感器是否可用 2) 点环境光订阅devecocli emulator sensor--targetPura 90--light-intensity 30000# 观察事件值 0 - 30000hdc shell snapshot_display-f/data/local/tmp/es.jpeg hdc file recv/data/local/tmp/es.jpeg.hdc shell hilog-x|Select-StringEnvironmentSensorsPlugin欢迎加入 CPF-Flutter 鸿蒙社区https://atomgit.com/CPF-Flutter
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

手机本地部署大模型实战:从模型量化到Android/iOS推理优化 2026/9/28 21:57:35

手机本地部署大模型实战:从模型量化到Android/iOS推理优化

1. 手机跑大模型这件事,到底靠不靠谱先说结论:能跑,但别指望它替代云端服务。我前后在骁龙8 Gen 2的Android机和iPhone 15 Pro上折腾了差不多两个月,从最初的“这玩意儿真能跑?”到后来把本地模型接进自己的笔记工作流…

阅读更多 →
Agent-Native架构重构实战:设计原理、最小实现与避坑指南 2026/9/28 21:57:28

Agent-Native架构重构实战:设计原理、最小实现与避坑指南

这两年我经手了不少LLM项目,一个感受越来越明显:大多数团队口中的“AI化”,不过是在传统系统外面套了一层会说话的前端。2024年下半年我在做一个客服知识库系统,最初就是标准的RAG加聊天窗口,用户在右上角点开机器人&a…

阅读更多 →
Python电商评论情感分析全流程实战:从数据采集到模型训练 2026/9/28 21:57:28

Python电商评论情感分析全流程实战:从数据采集到模型训练

简介:基于Python的电商买家评论情感分析项目包,专为毕业设计、期末大作业和课程设计场景打造,代码注释详尽,即使完全没有项目经验的新手也能看懂每一步实现,曾获98分且深受导师认可。整个压缩包约54MB,内含…

阅读更多 →
Substrate区块链开发框架详解:从理解核心架构到动手搭建自定义链 2026/9/28 21:56:58

Substrate区块链开发框架详解:从理解核心架构到动手搭建自定义链

1. substrate到底是什么:从一张实验台布说起很多刚接触区块链底层开发的朋友,看到"substrate"这个词都会愣一下——这到底是个框架、一个库、还是一条链?我第一次接触它的时候也绕了不少弯路,这里先给大家一个最直白的说…

阅读更多 →
S500无人机新手入门:Pixhawk4与FS-IA6B对码接线及飞控配置全攻略 2026/9/28 21:56:58

S500无人机新手入门:Pixhawk4与FS-IA6B对码接线及飞控配置全攻略

1. 为什么S500这套配置值得新手拿来练手S500机架配Pixhawk4飞控再加FS-IA6B接收机,这个组合在入门级四轴里算是相当经典的搭配。S500的轴距500mm,机架空间足够大,装起来不憋屈,炸机了维修成本也低。Pixhawk4作为一款成熟的开源飞控…

阅读更多 →
JSP+MySQL在线音乐管理系统:从数据库设计到部署全解析 2026/9/28 21:56:51

JSP+MySQL在线音乐管理系统:从数据库设计到部署全解析

简介:一个基于 JSP 技术栈开发的在线音乐信息管理系统完整项目,采用 Java Web JSP MySQL JavaScript 实现,适合正在学习 Java Web 开发、需要课程设计或毕业设计参考的学生。系统区分管理员与普通用户两类角色:前台支持歌曲查询…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉