1. 慢充和快充提示语
\frameworks\base\packages\SystemUI\res-keyguard\values-zh-rCN
中文提示语
1
2
3
|
<string name= "keyguard_plugged_in" msgid= "89308975354638682" > "正在充电" </string>
<string name= "keyguard_plugged_in_charging_fast" msgid= "8869226755413795173" > "正在快速充电" </string>
<string name= "keyguard_plugged_in_charging_slowly" msgid= "6637043106038550407" > "正在慢速充电" </string>
|
英文提示语
\frameworks\base\packages\SystemUI\res-keyguard\values
1.快充充电器充电-显示快速充电字符串
1
2
|
<!-- When the lock screen is showing and the phone plugged in, and the battery is not fully charged, and it 's plugged into a fast charger, say that it' s charging fast. -->
<string name= "keyguard_plugged_in_charging_fast" >Charging rapidly</string>
|
2.普通充电电器-显示充电,该同7.0及其以前特性
1
2
|
<!-- When the lock screen is showing and the phone plugged in, and the battery is not fully charged, say that it's charging. -->
<string name= "keyguard_plugged_in" >Charging</string>
|
3.电脑端或者笔记本端显示-缓慢充电
1
2
|
<!-- When the lock screen is showing and the phone plugged in, and the battery is not fully charged, and it 's plugged into a slow charger, say that it' s charging slowly. -->
<string name= "keyguard_plugged_in_charging_slowly" >Charging slowly</string>
|
2. 原理
根据当前的最大电压和电流计算出电流速度,并进行分类为慢速充电,充电,快速充电
2.1 源代码中的原始数据
1
2
|
• public static final String EXTRA_MAX_CHARGING_CURRENT = “max_charging_current”;
• public static final String EXTRA_MAX_CHARGING_VOLTAGE = “max_charging_voltage”;
|
发送“电池广播”位置将最大电流和电压上发应用层,这里主要一些8.1以上新增的数据,7.0以前有这个数据但是framework层没有使用
1
2
3
4
5
6
7
8
9
10
|
frameworks/base/services/core/java/com/android/server/BatteryService.java
// 发送电池广播事件
private void sendIntentLocked() {
// Pack up the values and broadcast them to everyone
final Intent intent = new Intent(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.2 adb shell 查看linux的文件节点
•获取当前的电流
1
2
3
|
adb shell cat /sys/ class /power_supply/battery/current_max
adb shell cat /sys/ class /power_supply/battery/current_max
30000001
|
•获取当前的电压
1
2
3
|
adb shell cat /sys/ class /power_supply/battery/voltage_max
adb shell cat /sys/ class /power_supply/battery/voltage_max
50000001
|
•具体源码
1
2
3
|
system/core/healthd/BatteryMonitor.cpp
#define POWER_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 的算法规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
....
} else if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
final int status = intent.getIntExtra(EXTRA_STATUS, BATTERY_STATUS_UNKNOWN);
final int plugged = intent.getIntExtra(EXTRA_PLUGGED, 0 );
final int level = intent.getIntExtra(EXTRA_LEVEL, 0 );
final int health = intent.getIntExtra(EXTRA_HEALTH, BATTERY_HEALTH_UNKNOWN);
final int maxChargingMicroAmp = intent.getIntExtra(EXTRA_MAX_CHARGING_CURRENT, - 1 );
int maxChargingMicroVolt = intent.getIntExtra(EXTRA_MAX_CHARGING_VOLTAGE, - 1 );
final int maxChargingMicroWatt;
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.
maxChargingMicroWatt = (maxChargingMicroAmp / 1000 )
* (maxChargingMicroVolt / 1000 );
} else {
maxChargingMicroWatt = - 1 ;
}
final Message msg = mHandler.obtainMessage(
MSG_BATTERY_UPDATE, new BatteryStatus(status, level, plugged, health,
maxChargingMicroWatt));
mHandler.sendMessage(msg);
|
2.4 显示字符串
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
事件接收
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
protected class BaseKeyguardCallback extends KeyguardUpdateMonitorCallback {
public static final int HIDE_DELAY_MS = 5000 ;
private int mLastSuccessiveErrorMessage = - 1 ;
@Override
public void onRefreshBatteryInfo(KeyguardUpdateMonitor.BatteryStatus status) {
boolean isChargingOrFull = status.status == BatteryManager.BATTERY_STATUS_CHARGING
|| status.status == BatteryManager.BATTERY_STATUS_FULL;
boolean wasPluggedIn = 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);
} else if (wasPluggedIn && !mPowerPluggedIn) {
hideTransientIndication();
}
}
}
=====================================================================================================
public static class BatteryStatus {
public static final int CHARGING_UNKNOWN = - 1 ;
public static final int CHARGING_SLOWLY = 0 ;
public static final int CHARGING_REGULAR = 1 ;
public static final int CHARGING_FAST = 2 ;
public final int status;
public final int level;
public final int plugged;
public final int health;
public final int maxChargingWattage;
public BatteryStatus( int status, int level, int plugged, int health,
int maxChargingWattage) {
this .status = status;
this .level = level;
this .plugged = plugged;
this .health = health;
this .maxChargingWattage = maxChargingWattage;
}
public final int getChargingSpeed( int slowThreshold, int fastThreshold) {
return maxChargingWattage <= 0 ? CHARGING_UNKNOWN :
maxChargingWattage < slowThreshold ? CHARGING_SLOWLY :
maxChargingWattage > fastThreshold ? CHARGING_FAST :
CHARGING_REGULAR;
}
|
显示字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
int chargingId;
switch (mChargingSpeed) {
case KeyguardUpdateMonitor.BatteryStatus.CHARGING_FAST:
chargingId = hasChargingTime
? R.string.keyguard_indication_charging_time_fast
: R.string.keyguard_plugged_in_charging_fast;
break ;
case KeyguardUpdateMonitor.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 ;
}
|
总结
以上所述是小编给大家介绍的Android 8.0 慢充和快充提示语的实现原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://blog.csdn.net/su749520/article/details/80346310