You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:43:11