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

如何在Android Studio中实现类似Ampere的充电器电流检测功能

实现类似Ampere的充电电流检测功能(Android Studio)

Ampere这类应用的核心是读取系统底层的电池硬件参数,以下是在Android Studio中实现该功能的具体步骤:

一、权限配置

首先在AndroidManifest.xml中添加必要权限:

<!-- 基础电池状态访问权限 -->
<uses-permission android:name="android.permission.ACCESS_BATTERY_STATE" />
<!-- 电池统计权限,用于获取更详细的电池数据 -->
<uses-permission android:name="android.permission.BATTERY_STATS" />
<!-- Android 11+ 需添加该特殊权限,用于访问系统级电池数据 -->
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />

其中PACKAGE_USAGE_STATS属于特殊权限,无法通过常规动态申请获取,需要引导用户手动开启:

// 跳转到应用使用权限设置页
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);

二、获取充电电流的核心实现

Android系统提供两种主流方式读取充电电流:

方式1:读取系统sysfs文件

大部分Android设备会在/sys/class/power_supply/battery/目录下暴露电池硬件数据,其中current_now文件存储当前电流值(单位:微安,正数为充电、负数为放电):

private long getBatteryCurrentFromSysfs() {
    try {
        // 部分设备路径可能不同,需适配,比如某些机型是batt_current
        File currentFile = new File("/sys/class/power_supply/battery/current_now");
        if (currentFile.exists()) {
            BufferedReader reader = new BufferedReader(new FileReader(currentFile));
            String currentStr = reader.readLine().trim();
            reader.close();
            return Long.parseLong(currentStr);
        }
    } catch (IOException | NumberFormatException e) {
        e.printStackTrace();
    }
    return 0;
}

方式2:反射调用系统隐藏API

Android系统的BatteryManager提供了隐藏的getLongProperty方法,可直接读取电池电流(Android 5.0+可用):

private long getBatteryCurrentViaReflection() {
    try {
        BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE);
        Method getLongPropertyMethod = BatteryManager.class.getMethod(
                "getLongProperty", int.class);
        // BATTERY_PROPERTY_CURRENT_NOW 常量值为2
        return (long) getLongPropertyMethod.invoke(batteryManager, 2);
    } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
        e.printStackTrace();
    }
    return 0;
}

三、补充充电状态与类型检测

搭配BatteryManager的公开API,可获取充电状态和充电类型(AC/USB/无线):

private void getChargeInfo() {
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Intent batteryIntent = registerReceiver(null, filter);
    
    // 判断是否在充电
    int status = batteryIntent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
    boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING
            || status == BatteryManager.BATTERY_STATUS_FULL;
    
    // 判断充电类型
    int plugType = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
    boolean isAcCharge = plugType == BatteryManager.BATTERY_PLUGGED_AC;
    boolean isUsbCharge = plugType == BatteryManager.BATTERY_PLUGGED_USB;
    boolean isWirelessCharge = plugType == BatteryManager.BATTERY_PLUGGED_WIRELESS;
}

四、UI实时更新

使用定时任务(如Handler或协程)每隔1秒读取一次电流数据,转换为毫安(除以1000)后更新UI:

private Handler handler = new Handler(Looper.getMainLooper());
private Runnable updateRunnable = new Runnable() {
    @Override
    public void run() {
        long currentMicroAmp = getBatteryCurrentFromSysfs();
        long currentMilliAmp = Math.abs(currentMicroAmp) / 1000;
        String chargeDirection = currentMicroAmp > 0 ? "充电" : "放电";
        currentTv.setText(String.format("%d mA (%s)", currentMilliAmp, chargeDirection));
        
        handler.postDelayed(this, 1000);
    }
};

// 在onResume启动定时更新
@Override
protected void onResume() {
    super.onResume();
    handler.post(updateRunnable);
}

// 在onPause停止更新
@Override
protected void onPause() {
    super.onPause();
    handler.removeCallbacks(updateRunnable);
}

附Ampere应用截图

Ampere应用截图

内容的提问来源于stack exchange,提问作者Ravi Taak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 12:03:20