SensorUtil 传感器工具扩展:在后台和屏幕关闭时保持传感器工作

« 返回首页

SensorUtil 传感器工具扩展

介绍

App Inventor 的传感器组件存在一个基本限制:当应用程序进入后台时,传感器组件会自动禁用。此扩展提供了三个组件,使传感器能够在后台运行、屏幕关闭和打盹模式下继续采集数据。

主要功能

  • 在后台/后台执行期间保持传感器功能
  • 通过前台服务(ForegroundService)和唤醒锁(WakeLock)实现
  • 通过平均值机制平滑嘈杂的传感器数据
  • 管理通知和电池优化权限

包含的组件

组件 图标 说明
UrsAI2SensorUtil icon 主组件,用于启动前台服务和管理权限
UrsSensorAverager savg 传感器平均器,用于平滑传感器数据
UrsAverager avg 通用平均器,用于计算任意数值的平均值

下载

.aix拓展文件:

de.ullisroboterseite.ursai2sensorutil.aix

.aia示例文件:

UrsSensorUtilTest.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(传感器)
移除 onPauseonResume 监听器,以保持传感器在后台激活。需要为每个要在后台保持活动的传感器调用此方法。
请求忽略电池优化 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
传感器值标识符。可选值:
  • 加速度计/陀螺仪:XYZ
  • 位置传感器:latitudelongitudealtitudespeed
  • 方向传感器:azimuthpitchroll
  • 计步器:SimpleStepsWalkStepsDistance
  • 接近传感器: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 不支持此传感器)。

数据平滑效果

通知权限请求

通知权限请求

电池优化设置

电池优化设置

修改通知内容

修改通知

注意事项

  1. 单实例限制:由于前台服务的要求,每个应用只能使用一个 UrsAI2SensorUtil 实例
  2. AI 伴侣限制:某些功能在 AI 伴侣中可能无法正常工作,建议使用编译后的 APK 进行测试
  3. 电池消耗:后台传感器数据采集会增加电池消耗,请谨慎使用
  4. Android 版本兼容性:不同 Android 版本对后台服务和权限的要求不同

通知图标要求

自定义通知图标需满足以下要求:

  • 尺寸:96×96 像素
  • 背景:透明
  • 图形:白色

原文链接

原版文档:Ullis Roboter Seite - AI2 SensorUtil

作者:Urs (Ullis Roboter Seite)

文档反馈