App Inventor 2 获取手机电池电量与电源状态检测教程

« 返回首页

概述

在开发 App 时,获取设备电池信息是一项常见需求。例如,电量监控类 App、需要根据电量调整行为的省电型 App、或者在后台运行时提醒用户及时充电的工具类 App。

App Inventor 2 内置组件中没有电池传感器(Sensors 分类下不包含电池相关组件),因此需要借助第三方扩展(Extension) 来实现电池信息获取。

本文将介绍如何使用 TaifunBattery 扩展 来获取以下电池信息:

  • 电池电量百分比
  • 充电状态(充电中 / 已充满 / 放电中 / 未充电)
  • 电源类型(USB / AC / 无线充电)
  • 电池健康状态、温度、电压
  • 电池容量、电流等高级信息

TaifunBattery 扩展简介

TaifunBattery 是由 Pura Vida Apps 开发的免费电池管理扩展,功能丰富且经过长期维护。

版本历史:

版本 发布时间 说明
V1 2016-06-20 初始版本,支持电量、状态、电源类型等基础功能
V1a 2016-08-11 修复 DX execution 错误
V2 2019-03-11 新增 CurrentNow、CurrentAvg、Capacity、ChargeCounter、EnergyCounter、Technology
V3 2021-08-24 新增下拉辅助积木块(注意:V3 与 V2 不兼容,仅用于新项目)

系统要求:

  • 基础功能:Android 4.0+
  • 高级功能(CurrentNow、CurrentAvg、Capacity 等):Android 5.0+(API Level 21)
  • 所需权限:(不需要任何额外权限)

下载地址: https://puravidaapps.com/battery.php


导入扩展

  1. Pura Vida Apps 官方页面 下载 .aix 文件(建议下载 V3 版本)
  2. 在 App Inventor 设计视图中,点击左侧面板底部的 “Extension”“Import extension”
  3. 选择下载的 .aix 文件,导入成功后即可在组件面板中看到 TaifunBattery3 组件
  4. TaifunBattery3 组件拖入屏幕中(它是一个不可见组件)

扩展属性详解

基础属性

属性 返回值 说明
Level 0 ~ 100 电池电量百分比
Status charging / full / discharging / not charging / unknown 电池充电状态
Plugged usb / ac / wireless / unknown 电源连接类型
Health cold / dead / good / overheat / over voltage / unknown / unspecified failure 电池健康状态
Temperature 数值 电池温度(摄氏度)
Voltage 数值 电池电压(毫伏)
Technology 文本 电池技术类型(如 Li-ion)

高级属性(需 Android 5.0+)

属性 返回值 说明
CurrentNow 整数 瞬时电流(微安),正值表示充电,负值表示放电
CurrentAverage 整数 平均电流(微安)
Capacity 整数 电池容量(微安时)
ChargeCounter 整数 剩余容量占总容量的整数百分比
EnergyCounter 长整数 剩余能量(纳瓦时)

事件

事件 说明
BatteryChanged 电池状态发生变化时触发

示例一:电池信息显示 App

界面设计

在 Design 视图中添加以下组件:

组件 名称 用途
Label LabelLevel 显示电池电量
Label LabelStatus 显示充电状态
Label LabelPlugged 显示电源类型
Label LabelTemp 显示电池温度
Label LabelVoltage 显示电池电压
Button ButtonRefresh 手动刷新按钮
TaifunBattery3 TaifunBattery3_1 电池扩展组件

积木代码

Screen1 初始化时获取电池信息

当 Screen1.初始化 时:
  设置 LabelLevel.文字 为 "电池电量:" + TaifunBattery3_1.电量 + "%"
  设置 LabelStatus.文字 为 "充电状态:" + TaifunBattery3_1.状态
  设置 LabelPlugged.文字 为 "电源类型:" + TaifunBattery3_1.电源类型
  设置 LabelTemp.文字 为 "电池温度:" + TaifunBattery3_1.温度 + "°C"
  设置 LabelVoltage.文字 为 "电池电压:" + TaifunBattery3_1.电压 + "mV"

电池状态变化时自动更新

当 TaifunBattery3_1.电池状态变化 时:
  设置 LabelLevel.文字 为 "电池电量:" + TaifunBattery3_1.电量 + "%"
  设置 LabelStatus.文字 为 "充电状态:" + TaifunBattery3_1.状态
  设置 LabelPlugged.文字 为 "电源类型:" + TaifunBattery3_1.电源类型
  设置 LabelTemp.文字 为 "电池温度:" + TaifunBattery3_1.温度 + "°C"
  设置 LabelVoltage.文字 为 "电池电压:" + TaifunBattery3_1.电压 + "mV"

手动刷新按钮

当 ButtonRefresh.点击 时:
  设置 LabelLevel.文字 为 "电池电量:" + TaifunBattery3_1.电量 + "%"
  设置 LabelStatus.文字 为 "充电状态:" + TaifunBattery3_1.状态
  设置 LabelPlugged.文字 为 "电源类型:" + TaifunBattery3_1.电源类型
  设置 LabelTemp.文字 为 "电池温度:" + TaifunBattery3_1.温度 + "°C"
  设置 LabelVoltage.文字 为 "电池电压:" + TaifunBattery3_1.电压 + "mV"

示例二:低电量提醒

当电池电量低于 20% 时弹出提醒通知,同时检测充电状态——如果已经在充电则不提醒。

界面设计

组件 名称 用途
Notifier Notifier1 弹出提醒通知
TaifunBattery3 TaifunBattery3_1 电池扩展组件
Clock Clock1 定时检测(TimerInterval 设为 60000,即每 60 秒检测一次)

积木代码

定义一个「检查电量并提醒」过程

定义 检查电量并提醒:
  变量 currentLevel = TaifunBattery3_1.电量
  变量 currentStatus = TaifunBattery3_1.状态

  如果 currentLevel < 20 且 currentStatus ≠ "charging" 则:
    调用 Notifier1.显示提醒("⚠️ 电量仅剩 " + currentLevel + "%,请及时充电!")

定时器触发检查

当 Clock1.定时器触发 时:
  调用 检查电量并提醒

电池状态变化时也检查

当 TaifunBattery3_1.电池状态变化 时:
  调用 检查电量并提醒

进阶:根据电量级别分级提醒

定义 检查电量并提醒:
  变量 level = TaifunBattery3_1.电量
  变量 status = TaifunBattery3_1.状态

  如果 status = "charging" 则:
    返回    // 已在充电,不需要提醒

  如果 level ≤ 5 则:
    调用 Notifier1.显示提醒("🔴 电量严重不足(" + level + "%),手机即将关机!")
  否则如果 level ≤ 15 则:
    调用 Notifier1.显示提醒("🟠 电量很低(" + level + "%),请尽快充电!")
  否则如果 level ≤ 20 则:
    调用 Notifier1.显示提醒("🟡 电量偏低(" + level + "%),建议充电。")

示例三:根据充电状态调整 App 行为

一个实用的场景:当 App 需要执行耗时操作(如大文件下载、GPS 持续追踪)时,先检测电池状态,在低电量时降低操作频率或暂停任务。

积木代码

定义 执行后台任务:
  变量 level = TaifunBattery3_1.电量
  变量 plugged = TaifunBattery3_1.电源类型
  变量 status = TaifunBattery3_1.状态

  如果 status = "charging" 或 plugged = "ac" 或 plugged = "usb" 则:
    // 正在充电,可以全速执行
    设置 Clock1.定时器间隔 为 5000     // 5 秒执行一次
    调用 执行高频任务
  否则如果 level > 50 则:
    // 电量充足,中等频率
    设置 Clock1.定时器间隔 为 30000    // 30 秒执行一次
    调用 执行标准任务
  否则如果 level > 20 则:
    // 电量一般,降低频率
    设置 Clock1.定时器间隔 为 120000   // 2 分钟执行一次
    调用 执行省电任务
  否则:
    // 电量低,暂停后台任务
    设置 Clock1.定时器启用 为 false
    调用 Notifier1.显示提醒("电量过低,已暂停后台任务。")

示例四:电池信息仪表盘

将电池电量以更直观的方式展示,根据电量百分比显示不同颜色。

界面设计

组件 名称 用途
Canvas Canvas1 绘制电量指示器
Label LabelInfo 显示详细电池信息
TaifunBattery3 TaifunBattery3_1 电池扩展组件
Clock Clock1 定时刷新(间隔 5000ms)

积木代码

定义 更新电量显示:
  变量 level = TaifunBattery3_1.电量

  // 清空画布
  调用 Canvas1.清空

  // 根据电量设置颜色
  变量 barColor = 绿色
  如果 level < 20 则:
    barColor = 红色
  否则如果 level < 50 则:
    barColor = 橙色

  // 绘制背景矩形(灰色)
  调用 Canvas1.绘制矩形(x1: 10, y1: 50, x2: 310, y2: 100, 颜色: 灰色, 填充: true)

  // 绘制电量矩形(彩色),宽度按百分比缩放
  变量 barWidth = level × 3      // 最大宽度 300px
  调用 Canvas1.绘制矩形(x1: 10, y1: 50, x2: 10 + barWidth, y2: 100, 颜色: barColor, 填充: true)

  // 绘制百分比文字
  调用 Canvas1.绘制文字(x: 160, y: 82, 文字: level + "%")

  // 更新详细信息
  变量 info = "状态:" + TaifunBattery3_1.状态
  info = info + "\n电源:" + TaifunBattery3_1.电源类型
  info = info + "\n温度:" + TaifunBattery3_1.温度 + "°C"
  info = info + "\n电压:" + TaifunBattery3_1.电压 + "mV"
  info = info + "\n健康:" + TaifunBattery3_1.健康状态
  设置 LabelInfo.文字 为 info

省电优化技巧

在使用 App Inventor 2 开发需要长时间运行的 App 时,以下省电技巧可以帮助减少电池消耗:

1. 合理设置定时器间隔

Clock 组件的定时器是最常见的电池消耗源。

// ❌ 不推荐:高频轮询
设置 Clock1.定时器间隔 为 100       // 100ms 一次,非常耗电

// ✅ 推荐:根据需求选择合理间隔
设置 Clock1.定时器间隔 为 30000     // 30 秒检测一次,已满足大多数场景

建议间隔:

  • 实时性要求高(如计时器):500ms ~ 1000ms
  • 常规检测(如电量监控):30000ms ~ 60000ms
  • 低频任务(如数据同步):300000ms(5 分钟)

2. 按需启用传感器

不需要传感器时应及时关闭,不要让 GPS、加速度计等传感器持续运行。

当 Screen1.离开屏幕 时:
  设置 LocationSensor1.启用 为 false
  设置 AccelerometerSensor1.启用 为 false
  设置 Clock1.定时器启用 为 false

3. 降低屏幕亮度需求

虽然 App Inventor 无法直接控制屏幕亮度,但可以通过设计手段减少亮屏时间:

  • 使用深色背景(OLED 屏幕更省电)
  • 减少不必要的动画和频繁界面刷新
  • 在适当时候使用 Screen.关闭屏幕 让屏幕休眠

4. 减少网络请求频率

每次网络请求都会唤醒无线电模块,消耗电量。

// 将多个小请求合并为一个批量请求
// 使用 Web 组件时,避免在定时器中频繁请求

当 Clock1.定时器触发 时:
  // ❌ 每次定时器触发都请求
  // 调用 Web1.执行请求

  // ✅ 仅在数据确实需要更新时请求
  如果 缓存过期 则:
    调用 Web1.执行请求

5. 后台运行时降低活动

结合电池电量信息,在电量低时自动降低 App 活动:

电量范围 建议操作
> 50% 正常运行,所有功能可用
20% ~ 50% 降低更新频率,减少网络请求
< 20% 暂停非必要后台任务,仅保留核心功能
正在充电 恢复正常运行,可执行耗时操作

6. 避免在循环中创建新组件

// ❌ 每次循环创建新的列表项,导致内存和CPU压力
当 Clock1.定时器触发 时:
  设置 ListView1.列表元素 为 获取新数据()    // 每次都刷新整个列表

// ✅ 仅在数据变化时更新
当 Clock1.定时器触发 时:
  变量 newData = 获取新数据()
  如果 newData ≠ 旧数据 则:
    设置 ListView1.列表元素 为 newData
    旧数据 = newData

完整项目下载

TaifunBattery 官方提供了示例 AIA 项目文件,可直接导入学习:


常见问题

Q:导入扩展后看不到 TaifunBattery 组件?

请确认导入的是 .aix 文件而不是 .aia 文件。.aix 是扩展文件,.aia 是项目文件。另外,V3 版本的组件名称为 TaifunBattery3,与 V2 的 TaifunBattery 不同。

Q:CurrentNow / CurrentAverage 属性返回异常值?

部分设备的电池管理芯片不支持电流读取,此时会返回 Long.MIN_VALUE(即 -9223372036854775808)。这是设备硬件限制,非扩展问题。同时这些属性需要 Android 5.0+ 系统。

Q:BatteryChanged 事件多久触发一次?

BatteryChanged 事件由 Android 系统广播触发,不是固定间隔。系统会在电池状态发生变化时(如电量变化、插拔充电器、温度变化等)自动触发,通常电量每变化 1% 就会触发一次。

Q:iOS 上能使用这个扩展吗?

不能。 TaifunBattery 是基于 Android Battery Manager API 开发的扩展,仅适用于 Android 平台。App Inventor 的 iOS 版本目前不支持第三方扩展。如果需要 iOS 电池信息,需要通过 Web Viewer 加载 JavaScript Battery API 的方式间接获取(但功能有限)。

Q:需要申请额外权限吗?

不需要。TaifunBattery 扩展读取电池信息不需要 BATTERY_STATS 或其他任何权限,因为 Android 系统的电池状态广播是公开的,任何 App 都可以接收。


注意事项

  1. Android 版本兼容性:基础属性(Level、Status、Plugged、Health、Temperature、Voltage)在 Android 4.0+ 即可使用;高级属性(CurrentNow、CurrentAverage、Capacity 等)需要 Android 5.0+
  2. 模拟器限制:Android 模拟器可能不提供准确的电池信息,建议在真机上测试
  3. iOS 不支持:此扩展仅适用于 Android,iOS 版 App Inventor 不支持
  4. V2 与 V3 不兼容:V3 版本重新设计了属性名称和下拉辅助块,不要在旧项目中替换升级,仅在新项目中使用 V3

*文档版本:2026.05 作者:App Inventor 2 中文网 www.fun123.cn*

参考资料与版权声明

原文来源

版权声明

本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:

  • MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
  • TaifunBattery 扩展版权归 Pura Vida Apps 所有
  • MIT App Inventor Community 帖子版权归原作者所有

本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。

文档反馈