本页介绍 Android 如何处理具有可拆卸电池或没有内置电池的产品。后一种设备改为连接到外部电源,例如交流电源插座或另一设备上的 USB 端口。
是否有电池?
应用程序可以使用以下代码来检测设备是否装有电池
```
final Intent batteryInfo = registerReceiver(null, new
IntentFilter(Intent.ACTION_BATTERY_CHANGED));
return batteryInfo.getBooleanExtra(BatteryManager.EXTRA_PRESENT, true);
```
无电池设备行为
如果 Android 没有为您的产品检测到电池设备,则会使用以下与电池相关的默认值。请注意,默认值在 Android 9 版本中已更改。下表显示了这些差异。
电池状态 | Android 9 及更高版本 | Android 8.1 及更低版本 |
---|---|---|
存在 | 否 | 是 |
状态 | 未知 | 正在充电 |
剩余容量 | 0 | 100% |
健康 | 未知 | 良好 |
交流充电器在线状态 | 未修改 | 强制为 true |
制造商可以使用内核 power_supply 驱动程序或 Health HAL 来更改默认设置。
Android 9 及更高版本
Android 9 移除了一些以前用于无电池设备的代码,这些代码默认情况下会假装存在电池、正在以 100% 的电量充电,并且健康状况良好,热敏电阻读数正常。
大多数处理此信息的框架 API 继续像以前一样处理常见情况:系统被认为是正在充电(即,未靠电池供电),并且不会被认为电池电量不足。如果用户界面绘制电池图标,它将显示一个感叹号,并且电池百分比显示为 0%。但是设备不会因为电池电量不足而关机,并且需要充电或良好电池的任务会被调度。
Android 8.1 及更低版本
由于电池状态未知,Android 框架 API 会将系统视为正在充电(或者,未靠电池供电),并且不会被认为电池电量不足。如果用户界面渲染电池图标,它将显示一个感叹号,并且电池百分比显示为 0%。但是设备不会因为电池电量不足而关机,并且需要充电或良好电池的任务会被调度。
实现
Android 9 的默认代码可能适用于您的设备,但建议您进行内核或 HAL 更改,以准确反映您产品的电源和电池状态,如上所述。如果 Android 9 及更高版本未检测到 Linux 电源类充电器设备,则默认情况下,所有充电器类型(交流、USB、无线)的状态都将为离线。如果所有充电器都离线但未检测到电池设备,则系统仍将被视为正在充电,因为它正在外部电源(而非电池电源)上运行,如前所述。
如果您的产品没有电池并且始终连接到电源,则最好为交流或 USB 电源实现 Linux 内核 power_supply 类充电器驱动程序,该驱动程序将其 online sysfs
属性设置为 true
。或者,您可以在设备的 Health HAL 中配置交流充电器在线属性。为此,请按照实现 Health 2.0中的描述实现 Health HAL。
此自定义 Health HAL 实现了 Health::getHealthInfo()
的自定义版本,该版本修改了 BatteryProperties.chargerAcOnline = true
的值。
要开始使用,请将文件 hardware/interfaces/health/2.0/default/Health.cpp
复制到您自己的 Health HAL 实现中,并根据 Health 2.0 README 进行修改。