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慢充和快充提示语的实现原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!