当前位置: 首页 > news >正文

【Battery】慢速和快速充电的显示逻辑

【Battery】慢速和快速充电的显示逻辑

  • 一、需求描述
  • 二、需求分析
  • 三、解决方案
  • 四、Battery 扩展

一、需求描述

基于 Android 14平台,锁屏界面显示为慢速充电,慢速 会造成用户体验不好,需要修改为充电,并重新配置快速充电的阈值。

二、需求分析

SystemUI 锁屏界面上显示充电表示的逻辑:src/com/android/systemui/statusbar/KeyguardIndicationController.java

if (mPowerPluggedInWired) {switch (mChargingSpeed) {case BatteryStatus.CHARGING_FAST:chargingId = hasChargingTime? R.string.keyguard_indication_charging_time_fast: R.string.keyguard_plugged_in_charging_fast;break;case BatteryStatus.CHARGING_SLOWLY:chargingId = hasChargingTime? R.string.keyguard_indication_charging_time_slowly: R.string.keyguard_plugged_in_charging_slowly;break;default:chargingId = hasChargingTime? R.string.keyguard_indication_charging_time: R.string.keyguard_plugged_in;break;}
} 

主要通过系统电池状态 BatteryStatus.CHARGING_FAST 和 BatteryStatus.CHARGING_SLOWLY 来区分快速、慢速和正常充电的。mChargingSpeed 的赋值是 KeyguardUpdateMonitor 的回调来更新状态 onRefreshBatteryInfo

/*** KeyguardUpdateMonitor only sends "interesting" battery updates* {@link KeyguardUpdateMonitor#isBatteryUpdateInteresting}.* Therefore, make sure to always check plugged in state along with any charging status* change, or else we could end up with stale state.*/
@Override
public void onRefreshBatteryInfo(BatteryStatus status) {boolean isChargingOrFull = status.status == BatteryManager.BATTERY_STATUS_CHARGING|| status.isCharged();boolean wasPluggedIn = mPowerPluggedIn;mPowerPluggedInWired = status.isPluggedInWired() && isChargingOrFull;mPowerPluggedInWireless = status.isPluggedInWireless() && isChargingOrFull;mPowerPluggedInDock = status.isPluggedInDock() && isChargingOrFull;mPowerPluggedIn = status.isPluggedIn() && isChargingOrFull;mPowerCharged = status.isCharged();mChargingWattage = status.maxChargingWattage;mChargingSpeed = status.getChargingSpeed(mContext);mBatteryLevel = status.level;mBatteryPresent = status.present;mBatteryDefender = status.isBatteryDefender();// when the battery is overheated, device doesn't charge so only guard on pluggedIn:mEnableBatteryDefender = mBatteryDefender && status.isPluggedIn();mIncompatibleCharger = status.incompatibleCharger.orElse(false);try {mChargingTimeRemaining = mPowerPluggedIn? mBatteryInfo.computeChargeTimeRemaining() : -1;} catch (RemoteException e) {mKeyguardLogger.log(TAG, ERROR, "Error calling IBatteryStats", e);mChargingTimeRemaining = -1;}mKeyguardLogger.logRefreshBatteryInfo(isChargingOrFull, mPowerPluggedIn, mBatteryLevel,mBatteryDefender);updateDeviceEntryIndication(!wasPluggedIn && mPowerPluggedInWired);
}

再通过 SettingLib: src/com/android/settingslib/fuelgauge/BatteryStatus.java,找到判断 CHARGING_FAST 或 CHARGING_SLOWLY 或 CHARGING_REGULAR 的状态判断逻辑

public final int getChargingSpeed(Context context) {final int slowThreshold = context.getResources().getInteger(R.integer.config_chargingSlowlyThreshold);// <integer name="config_chargingFastThreshold_unisoc">15000000</integer>// 这里 Sprd 做过修改final int fastThreshold =UniSettingsLibComponentFactory.getInstance().getChargingFastThreshold(context);return maxChargingWattage <= 0 ? CHARGING_UNKNOWN :maxChargingWattage < slowThreshold ? CHARGING_SLOWLY :maxChargingWattage > fastThreshold ? CHARGING_FAST :CHARGING_REGULAR;
}

config_chargingSlowlyThreshold 的定义如下,config_chargingFastThreshold 暂未使用而是使用 unisoc 修改的 config

<!-- Threshold in micro watts below which a charger is rated as "slow"; 1A @ 5V -->
<integer name="config_chargingSlowlyThreshold">5000000</integer><!-- Threshold in micro watts above which a charger is rated as "fast"; 1.5A @ 5V  -->
<integer name="config_chargingFastThreshold">7500000</integer>

上诉的 maxChargingWattage 的赋值如下,是通过 batteryChangedIntent

private BatteryStatus(Intent batteryChangedIntent, Optional<Boolean> incompatibleCharger) {status = batteryChangedIntent.getIntExtra(EXTRA_STATUS, BATTERY_STATUS_UNKNOWN);plugged = batteryChangedIntent.getIntExtra(EXTRA_PLUGGED, 0);level = getBatteryLevel(batteryChangedIntent);chargingStatus = batteryChangedIntent.getIntExtra(EXTRA_CHARGING_STATUS,CHARGING_POLICY_DEFAULT);present = batteryChangedIntent.getBooleanExtra(EXTRA_PRESENT, true);this.incompatibleCharger = incompatibleCharger;final int maxChargingMicroAmp = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_CURRENT,-1);int maxChargingMicroVolt = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_VOLTAGE, -1);if (maxChargingMicroVolt <= 0) {maxChargingMicroVolt = DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT;}if (maxChargingMicroAmp > 0) {// Calculating muW = muA * muV / (10^6 mu^2 / mu); splitting up the divisor// to maintain precision equally on both factors.maxChargingWattage = (maxChargingMicroAmp / 1000)* (maxChargingMicroVolt / 1000);} else {maxChargingWattage = -1;}}

三、解决方案

为了修改锁屏界面上的显示慢速充电或者快速充电的阈值,直接调整 2 个config 的值即可!如果不想显示为慢速充电,将 config_chargingSlowlyThreshold 修改为不为 0 的极小值即可,如1。

<integer name="config_chargingSlowlyThreshold">1</integer>
<integer name="config_chargingFastThreshold_unisoc">15000000</integer>

除了锁屏界面,设置 - 电池界面也有这样的显示,逻辑相同。

四、Battery 扩展

frameworks/base/services/core/java/com/android/server/BatteryService.java

private void dumpInternal(FileDescriptor fd, PrintWriter pw, String[] args) {synchronized (mLock) {if (args == null || args.length == 0 || "-a".equals(args[0])) {pw.println("Current Battery Service state:");if (mUpdatesStopped) {pw.println("  (UPDATES STOPPED -- use 'reset' to restart)");}pw.println("  AC powered: " + mHealthInfo.chargerAcOnline);pw.println("  USB powered: " + mHealthInfo.chargerUsbOnline);pw.println("  Wireless powered: " + mHealthInfo.chargerWirelessOnline);pw.println("  Dock powered: " + mHealthInfo.chargerDockOnline);pw.println("  Max charging current: " + mHealthInfo.maxChargingCurrentMicroamps);pw.println("  Max charging voltage: " + mHealthInfo.maxChargingVoltageMicrovolts);pw.println("  Charge counter: " + mHealthInfo.batteryChargeCounterUah);pw.println("  status: " + mHealthInfo.batteryStatus);pw.println("  health: " + mHealthInfo.batteryHealth);pw.println("  present: " + mHealthInfo.batteryPresent);pw.println("  level: " + mHealthInfo.batteryLevel);pw.println("  scale: " + BATTERY_SCALE);pw.println("  voltage: " + mHealthInfo.batteryVoltageMillivolts);pw.println("  temperature: " + mHealthInfo.batteryTemperatureTenthsCelsius);pw.println("  technology: " + mHealthInfo.batteryTechnology);} else {Shell shell = new Shell();shell.exec(mBinderService, null, fd, null, args, null, new ResultReceiver(null));}}
}

可以通过 ADB 命令 dump BatteryService 的相关信息:

C:\Users\Administrator>adb shell dumpsys battery
Current Battery Service state:AC powered: falseUSB powered: trueWireless powered: falseDock powered: falseMax charging current: 500000Max charging voltage: 5000000Charge counter: 1status: 2health: 2present: truelevel: 95scale: 100voltage: 4313temperature: 325technology: Li-ion

电池状态信息参数解析:

参数数值说明
AC poweredfalse设备未通过交流电源(如墙式充电器)充电。
USB poweredtrue设备正在通过 USB 连接充电。
Wireless poweredfalse设备未通过无线方式充电。
Dock poweredfalse设备未通过底座充电。
Max charging current500000当前配置的最大充电电流为 500,000 微安 (µA),即 500 毫安 (mA)。
Max charging voltage5000000当前配置的最大充电电压为 5,000,000 微伏 (µV),即 5 伏 (V)。
Charge counter1029715电池的电荷计数器,单位通常为微安时 (µAh),用于跟踪电池的充放电周期。
status2电池状态2表示电池正处于充电状态。其他常见状态包括:3(未充电)、4(不充电)、5(已充满)。
health2电池健康状态2表示电池健康状况良好
presenttrue表示电池已安装在设备中。
level64当前电池电量百分比为 64%
scale100电池电量的满量程为 100%
voltage4020当前电池的电压为 4020 毫伏 (mV),即 4.02 伏 (V)
temperature266电池的温度为 266,单位是十分之一摄氏度。因此实际温度为 26.6 摄氏度
technologyLi-ion电池技术类型为锂离子电池

这个命令只能查看当前的电压,没有显示当前的电流,可以尝试直接读取系统文件来获取电流值,使用以下命令查看相关文件是否存在并包含数据:

adb shell cat /sys/class/power_supply/battery/current_now

如果这个路径不存在,可以尝试列出电源供应目录下的内容,寻找可能的文件:

adb shell ls -la /sys/class/power_supply/
adb shell ls -la /sys/class/power_supply/*/current_now

找到的正确文件可能会返回一个以微安(µA)为单位的数值,负值表示充电,正值表示放电

http://www.dtcms.com/a/428262.html

相关文章:

  • 一个startActivity请求是如何穿越进程边界
  • 怎么看一个网站是用什么程序做的衡水建设网站
  • 网站建设配图微商城网站建设信息
  • 富文本【表格】
  • 【Java数据结构】——堆(找出用于解决最大/最小的n个元素,或者求中位数)
  • Python快速入门专业版(五十一):Python异常处理进阶:try-except-finally与raise语句(资源释放与主动抛异常)
  • 买家秀接口深度开发:从内容解析到情感分析的全链路实现
  • 密钥管理系统KSP在智能水表行业的应用
  • 中国建设银行网站多少汕头网站建设过程
  • 基于STM32与influxDB的电力监控系统-6
  • 【教程】nvidia-smi dmon获取GPU相关的完整信息
  • wordpress 网站上传制作网站的公司叫什么
  • 服装网站建设运营规划扬州网站建设推广
  • 网站后台管理怎么进asp网站服务建设
  • 公司建网站多少钱一个免费网页代理在线
  • 大连网站建设 青鸟传媒百度云平台建设网站
  • 豆各庄做网站的公司网站版块设计是什么意思
  • 代发新闻稿的网站四大软件外包公司
  • 信用体系建设网站维运工作制度任丘建设网站制作
  • JavaBean参数校验
  • 洛阳php网站开发桂林象鼻山照片
  • 第八章 惊喜13 落子无悔
  • 手机网站开发计划门户网站平台建设的经费
  • Playwright MCP浏览器自动化详解指南
  • 本地部署开源流处理框架 Apache Flink 并实现外部访问
  • Java 大视界 -- 基于 Java 的大数据分布式存储在科研数据管理与共享中的创新应用(418)
  • 网站二级页怎么做手机网站设计与规划
  • iOS 抓包工具有哪些?实战对比、场景分工与开发者排查流程
  • 上海浦东网站建设公司在深圳注册一个公司需要多少钱
  • 机械网站建设公司推荐seo如何优化网站