SensorUtil 传感器工具扩展
介绍
App Inventor 的传感器组件存在一个基本限制:当应用程序进入后台时,传感器组件会自动禁用。此扩展提供了三个组件,使传感器能够在后台运行、屏幕关闭和打盹模式下继续采集数据。
主要功能
- 在后台/后台执行期间保持传感器功能
- 通过前台服务(ForegroundService)和唤醒锁(WakeLock)实现
- 通过平均值机制平滑嘈杂的传感器数据
- 管理通知和电池优化权限
包含的组件
| 组件 | 图标 | 说明 |
|---|---|---|
| UrsAI2SensorUtil | 主组件,用于启动前台服务和管理权限 | |
| UrsSensorAverager | ![]() |
传感器平均器,用于平滑传感器数据 |
| UrsAverager | ![]() |
通用平均器,用于计算任意数值的平均值 |
下载
.aix拓展文件:
de.ullisroboterseite.ursai2sensorutil.aix
.aia示例文件:
版本历史
| 版本 | 日期 | 修改内容 |
|---|---|---|
| 1.0 | 2025-10-09 | 初始版本 |
工作原理
前台服务
Android 限制后台应用的活动以节省电池。要在后台持续运行,应用必须启动前台服务。前台服务会在状态栏显示通知,告知用户应用正在后台运行。
![]()
传感器生命周期
App Inventor 的传感器组件在 onPause 事件中禁用,在 onResume 事件中重新启用。要保持传感器在后台运行,需要移除这些监听器。
权限要求
- 通知权限:Android 13+ 需要
POST_NOTIFICATIONS权限才能显示通知 - 电池优化豁免:要在打盹模式下运行,需要请求忽略电池优化
设计器属性

UrsAI2SensorUtil 组件参考
属性 Properties
- 操作1标题 Action1Title
- 通知中操作按钮1的标题。
- 操作2标题 Action2Title
- 通知中操作按钮2的标题。
- 操作3标题 Action3Title
- 通知中操作按钮3的标题。
- 获取WiFi锁 AquireWiFiLock
- 指定启动前台服务时是否获取 WiFi 锁。
- 通知是否启用 AreNotificationsEnabled
- 返回通知是否已启用。
- 通道描述 ChannelDescription
- 用户可见的通知通道描述。
- 通道ID ChannelID
- 内部通道标识符,在实例化时设置一次。
- 通道重要性 ChannelImportance
- 通知的打断级别,创建后不可修改。
- 通道名称 ChannelName
- 用户可见的通道名称,可修改。
- 是否忽略电池优化 IsIgnoringBatteryOptimizations
- 返回应用是否已获得电池优化豁免。
- 是否在伴侣中运行 IsRunningInCompanion
- 指示应用是在 AI 伴侣中运行还是已编译的 APK 中运行。
- 通知可删除 NotificationDeletable
- 控制用户是否可以关闭通知。
- 通知图标 NotificationIcon
- 状态栏图标的系统可绘制资源名称。
- 通知图标资源 NotificationIconAsset
- 自定义图标(96x96像素,透明背景,白色图形)。
- 通知ID NotificationID
- 唯一的通知标识符。
- 通知大图标 NotificationLargeIcon
- 通知显示的大图标。
- 通知文本 NotificationText
- 通知的内容文本。
- 通知标题 NotificationTitle
- 通知的标题。
- 要打开的屏幕 ScreenToOpen
- 点击通知时打开的目标屏幕。
- 启动值 StartValue
- 通过
get start value传递给打开屏幕的参数。 - 版本 Version
- 组件版本标识符。
- SDK版本 VersionSDK
- 运行的 Android SDK 版本号。
方法 Methods
- 移除监听器 RemoveListeners(传感器)
- 移除
onPause和onResume监听器,以保持传感器在后台激活。需要为每个要在后台保持活动的传感器调用此方法。 - 请求忽略电池优化 RequestIgnoreBatteryOptimizations()
- 请求用户允许应用忽略电池优化。这允许应用在打盹模式下运行。
- 请求通知权限 RequestNotificationPermission()
- 请求发布通知的权限(Android 13+ 需要)。
- 启动前台服务 StartForegroundService()
- 启动前台服务,包含 WakeLock 和通知。
- 停止前台服务 StopForegroundService()
- 停止前台服务并移除通知。
事件 Events
- 服务启动后 AfterServiceStarted()
- 指示前台服务已启动。
- 操作点击 OnActionClick(操作编号)
- 当用户点击通知操作按钮时触发。返回按钮编号(1、2 或 3)。
- 后台权限响应 OnBackgroundPermissionResponse(已授权)
- 返回
RequestIgnoreBatteryOptimizations的结果。 - 删除通知 OnDeleteNotification()
- 当用户关闭通知时触发(Android 15+ 支持)。
- 权限响应 OnPermissionResponse(已授权)
- 返回
RequestNotificationPermission的结果。 - 暂停 OnPause()
- 应用暂停时触发(Activity 生命周期事件)。
- 恢复 OnResume()
- 应用恢复时触发(Activity 生命周期事件)。
- 停止 OnStop()
- 应用停止时触发(不再可见)。
UrsSensorAverager 组件参考
此组件用于平滑传感器数据。它连接到传感器组件并自动收集数据。
属性 Properties
- 平均值 Average
- 计算存储值的算术平均值。
- 缓存大小 CacheSize
- 要聚合的值的数量。
- 计数 Count
- 当前缓存中的值数量。
- 数据源键 DataSourceKey
- 传感器值标识符。可选值:
- 加速度计/陀螺仪:
X、Y、Z - 位置传感器:
latitude、longitude、altitude、speed - 方向传感器:
azimuth、pitch、roll - 计步器:
SimpleSteps、WalkSteps、Distance - 接近传感器:
Distance
- 加速度计/陀螺仪:
- 源 Source
- 连接的传感器组件。支持:AccelerometerSensor、GyroscopeSensor、LocationSensor、OrientationSensor、Pedometer、ProximitySensor。
- 加权平均值 WeightedAverage
- 计算存储值的加权平均值,最近的值权重更高。
加权平均值计算公式
当缓存中有5个值时:
结果 = (V₁×1 + V₂×2 + V₃×3 + V₄×4 + V₅×5) / (1+2+3+4+5)
UrsAverager 组件参考
此组件是通用平均器,可用于任何数值的平滑处理,包括不被 UrsSensorAverager 支持的传感器(如 MagneticFieldSensor)。
属性 Properties
- 平均值 Average
- 计算算术平均值。
- 缓存大小 CacheSize
- 要聚合的值的数量。
- 计数 Count
- 存储的值数量。
- 加权平均值 WeightedAverage
- 计算加权平均值(最近的值权重更高)。
方法 Methods
- 添加 Add(值)
- 向缓存添加新值。如果超过 CacheSize,最旧的值将被移除。
使用示例
示例项目概述

示例项目包含三个屏幕:
- Screen1:主控制界面,包含扩展功能
- Screen2:测试 ScreenToOpen 通知属性
- About:文档链接
实现概述

权限设置

前台服务设置

加速度计数据采集

示例功能:
- 通过 SensorChanged 事件显示实时传感器数据
- 每秒通过 GetValues 方法获取读数
- 向 255.255.255.255:2222 发送 UDP 广播
- 使用 UrsSensorAverager 计算 X 值的滚动平均
磁场传感器数据平滑

使用 UrsAverager 组件处理 MagneticFieldSensor 数据(UrsSensorAverager 不支持此传感器)。

通知权限请求

电池优化设置

修改通知内容

注意事项
- 单实例限制:由于前台服务的要求,每个应用只能使用一个 UrsAI2SensorUtil 实例
- AI 伴侣限制:某些功能在 AI 伴侣中可能无法正常工作,建议使用编译后的 APK 进行测试
- 电池消耗:后台传感器数据采集会增加电池消耗,请谨慎使用
- Android 版本兼容性:不同 Android 版本对后台服务和权限的要求不同
通知图标要求
自定义通知图标需满足以下要求:
- 尺寸:96×96 像素
- 背景:透明
- 图形:白色
原文链接
原版文档:Ullis Roboter Seite - AI2 SensorUtil
作者:Urs (Ullis Roboter Seite)


扫码添加客服咨询