支持无电池设备

本页将介绍 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 及更低版本
存在 false true
状态 未知 正在充电
剩余电量 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 power supply 类充电器设备,则在默认情况下,所有充电器类型(交流、USB、无线)的状态都将为“离线”。如前所述,如果所有充电器都处于离线状态,但未检测到电池设备,则系统仍会被视为“正在充电”,也就是说,系统正在使用外部电源(而不是电池电量)运行。

如果您的产品没有电池,且会始终连接到电源,那么,您最好针对交流电源或 USB 电源(其在线 sysfs 属性会设置为 true)实现 Linux 内核 power_supply 类充电器驱动程序。或者,您也可以在 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 对其进行修改。