如何在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应用截图

内容的提问来源于stack exchange,提问作者Ravi Taak
相关产品推荐
相关产品推荐

