支持无电池设备

本页介绍 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 进行修改。