Android 8.0 慢充和快充提示语的实现原理
1.慢充和快充提示语
\frameworks\base\packages\SystemUI\res-keyguard\values-zh-rCN
中文提示语
"正在充电" "正在快速充电" "正在慢速充电"
英文提示语
\frameworks\base\packages\SystemUI\res-keyguard\values
1.快充充电器充电-显示快速充电字符串
Chargingrapidly
2.普通充电电器-显示充电,该同7.0及其以前特性
Charging
3.电脑端或者笔记本端显示-缓慢充电
Chargingslowly
2.原理
根据当前的最大电压和电流计算出电流速度,并进行分类为慢速充电,充电,快速充电
2.1源代码中的原始数据
•publicstaticfinalStringEXTRA_MAX_CHARGING_CURRENT=“max_charging_current”; •publicstaticfinalStringEXTRA_MAX_CHARGING_VOLTAGE=“max_charging_voltage”;
发送“电池广播”位置将最大电流和电压上发应用层,这里主要一些8.1以上新增的数据,7.0以前有这个数据但是framework层没有使用
frameworks/base/services/core/java/com/android/server/BatteryService.java //发送电池广播事件 privatevoidsendIntentLocked(){ //Packupthevaluesandbroadcastthemtoeveryone finalIntentintent=newIntent(Intent.ACTION_BATTERY_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY |Intent.FLAG_RECEIVER_REPLACE_PENDING); ....... intent.putExtra(BatteryManager.EXTRA_MAX_CHARGING_CURRENT,mBatteryProps.maxChargingCurrent); intent.putExtra(BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE,mBatteryProps.maxChargingVoltage);
2.2adbshell查看linux的文件节点
•获取当前的电流
adbshellcat/sys/class/power_supply/battery/current_max adbshellcat/sys/class/power_supply/battery/current_max 30000001
•获取当前的电压
adbshellcat/sys/class/power_supply/battery/voltage_max adbshellcat/sys/class/power_supply/battery/voltage_max 50000001
•具体源码
system/core/healthd/BatteryMonitor.cpp #definePOWER_SUPPLY_SYSFS_PATH"/sys/class/"POWER_SUPPLY_SUBSYSTEM path.appendFormat("%s/%s/voltage_max",POWER_SUPPLY_SYSFS_PATH,mChargerNames[i].string());
2.3上层接收广播
frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
重点看maxChargingMicroAmp和maxChargingMicroVolt的算法规则
privatefinalBroadcastReceivermBroadcastReceiver=newBroadcastReceiver(){ .... }elseif(Intent.ACTION_BATTERY_CHANGED.equals(action)){ finalintstatus=intent.getIntExtra(EXTRA_STATUS,BATTERY_STATUS_UNKNOWN); finalintplugged=intent.getIntExtra(EXTRA_PLUGGED,0); finalintlevel=intent.getIntExtra(EXTRA_LEVEL,0); finalinthealth=intent.getIntExtra(EXTRA_HEALTH,BATTERY_HEALTH_UNKNOWN); finalintmaxChargingMicroAmp=intent.getIntExtra(EXTRA_MAX_CHARGING_CURRENT,-1); intmaxChargingMicroVolt=intent.getIntExtra(EXTRA_MAX_CHARGING_VOLTAGE,-1); finalintmaxChargingMicroWatt; if(maxChargingMicroVolt<=0){ maxChargingMicroVolt=DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT; } if(maxChargingMicroAmp>0){ //CalculatingmuW=muA*muV/(10^6mu^2/mu);splittingupthedivisor //tomaintainprecisionequallyonbothfactors. maxChargingMicroWatt=(maxChargingMicroAmp/1000) *(maxChargingMicroVolt/1000); }else{ maxChargingMicroWatt=-1; } finalMessagemsg=mHandler.obtainMessage( MSG_BATTERY_UPDATE,newBatteryStatus(status,level,plugged,health, maxChargingMicroWatt)); mHandler.sendMessage(msg);
2.4显示字符串
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
事件接收
protectedclassBaseKeyguardCallbackextendsKeyguardUpdateMonitorCallback{ publicstaticfinalintHIDE_DELAY_MS=5000; privateintmLastSuccessiveErrorMessage=-1; @Override publicvoidonRefreshBatteryInfo(KeyguardUpdateMonitor.BatteryStatusstatus){ booleanisChargingOrFull=status.status==BatteryManager.BATTERY_STATUS_CHARGING ||status.status==BatteryManager.BATTERY_STATUS_FULL; booleanwasPluggedIn=mPowerPluggedIn; mPowerPluggedIn=status.isPluggedIn()&&isChargingOrFull; mPowerCharged=status.isCharged(); mChargingWattage=status.maxChargingWattage; mChargingSpeed=status.getChargingSpeed(mSlowThreshold,mFastThreshold); updateIndication(); if(mDozing){ if(!wasPluggedIn&&mPowerPluggedIn){ showTransientIndication(computePowerIndication()); hideTransientIndicationDelayed(HIDE_DELAY_MS); }elseif(wasPluggedIn&&!mPowerPluggedIn){ hideTransientIndication(); } } } ===================================================================================================== publicstaticclassBatteryStatus{ publicstaticfinalintCHARGING_UNKNOWN=-1; publicstaticfinalintCHARGING_SLOWLY=0; publicstaticfinalintCHARGING_REGULAR=1; publicstaticfinalintCHARGING_FAST=2; publicfinalintstatus; publicfinalintlevel; publicfinalintplugged; publicfinalinthealth; publicfinalintmaxChargingWattage; publicBatteryStatus(intstatus,intlevel,intplugged,inthealth, intmaxChargingWattage){ this.status=status; this.level=level; this.plugged=plugged; this.health=health; this.maxChargingWattage=maxChargingWattage; } publicfinalintgetChargingSpeed(intslowThreshold,intfastThreshold){ returnmaxChargingWattage<=0?CHARGING_UNKNOWN: maxChargingWattagefastThreshold?CHARGING_FAST: CHARGING_REGULAR; }
显示字符串
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java intchargingId; switch(mChargingSpeed){ caseKeyguardUpdateMonitor.BatteryStatus.CHARGING_FAST: chargingId=hasChargingTime ?R.string.keyguard_indication_charging_time_fast :R.string.keyguard_plugged_in_charging_fast; break; caseKeyguardUpdateMonitor.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; }
总结
以上所述是小编给大家介绍的Android8.0慢充和快充提示语的实现原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!