求获取Android设备电池充电循环数及最大充电量的Java代码
获取Android电池充电循环次数及最大电量的解决方案
一、核心参数获取代码
1. 总充电循环次数
通过系统BatteryManager的广播Intent读取EXTRA_CYCLE_COUNT,这是官方推荐的方式:
// 获取电池状态广播Intent Intent batteryIntent = getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); if (batteryIntent != null) { // 读取循环次数,默认返回-1表示设备不支持 int cycleCount = batteryIntent.getIntExtra(BatteryManager.EXTRA_CYCLE_COUNT, -1); if (cycleCount != -1) { Log.d("BatteryStats", "总充电循环次数: " + cycleCount); } else { Log.d("BatteryStats", "当前设备不支持获取充电循环次数"); } }
2. 上一次充电循环最大电量水平
根据需求分为两种场景:
场景1:最近一次充电达到的最高电量百分比
通过监听充电状态广播,记录充电过程中的最高电量:
private BroadcastReceiver chargingStateReceiver = new BroadcastReceiver() { private int maxChargedPercent = 0; @Override public void onReceive(Context context, Intent intent) { int batteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); if (level == -1 || scale == -1) return; float currentPercent = (level / (float) scale) * 100; // 充电中或已充满时更新最高电量记录 if (batteryStatus == BatteryManager.BATTERY_STATUS_CHARGING || batteryStatus == BatteryManager.BATTERY_STATUS_FULL) { maxChargedPercent = Math.max(maxChargedPercent, (int) currentPercent); } // 断开充电时输出结果并重置记录 else if (intent.getAction() != null && intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) { if (maxChargedPercent > 0) { Log.d("BatteryStats", "上一次充电循环最大电量: " + maxChargedPercent + "%"); maxChargedPercent = 0; } } } }; // 在Activity/Fragment的onCreate中注册广播 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); filter.addAction(Intent.ACTION_POWER_DISCONNECTED); registerReceiver(chargingStateReceiver, filter); } // 在onDestroy中注销广播 @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(chargingStateReceiver); }
场景2:电池当前最大容量(反映老化程度)
API 28(Android 9.0)及以上可通过EXTRA_CAPACITY读取当前电池最大容量相对于设计容量的百分比:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { if (batteryIntent != null) { int capacityPercent = batteryIntent.getIntExtra(BatteryManager.EXTRA_CAPACITY, -1); if (capacityPercent != -1) { Log.d("BatteryStats", "电池当前最大容量百分比: " + capacityPercent + "%"); } else { Log.d("BatteryStats", "设备不支持读取电池最大容量"); } } }
二、解决EXTRA_CYCLE_COUNT返回0的问题
1. 系统版本检查
EXTRA_CYCLE_COUNT是API 21(Android 5.0)新增的接口,低于该版本的设备无法读取,会返回默认值(-1或0)。
2. 设备厂商限制
部分定制ROM未实现该参数的上报,即使系统版本达标也会返回0。可尝试:
- 重启设备后重新读取;
- 开启开发者选项中的「电池统计」相关开关(不同厂商路径不同);
- 若设备已ROOT,可直接读取系统底层文件:
public static int getCycleCountWithRoot() { try { File cycleFile = new File("/sys/class/power_supply/battery/cycle_count"); if (cycleFile.exists()) { BufferedReader reader = new BufferedReader(new FileReader(cycleFile)); String cycleStr = reader.readLine().trim(); reader.close(); return Integer.parseInt(cycleStr); } } catch (Exception e) { e.printStackTrace(); } return -1; }
3. 电池本身状态
如果设备是全新机、刚更换电池,循环次数确实为0。完成一次完整充电循环(从电量低于20%充至满电,再用到低于20%)后重新读取即可。
内容的提问来源于stack exchange,提问作者Shilpi Saha
相关产品推荐
相关产品推荐

