博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 8.0 慢充和快充提示语
阅读量:4147 次
发布时间:2019-05-25

本文共 6737 字,大约阅读时间需要 22 分钟。

1. 慢充和快充提示语

\frameworks\base\packages\SystemUI\res-keyguard\values-zh-rCN

中文提示语

"正在充电"
"正在快速充电"
"正在慢速充电"

英文提示语

\frameworks\base\packages\SystemUI\res-keyguard\values

1.快充充电器充电-显示快速充电字符串
Charging rapidly
2.普通充电电器-显示充电,该同7.0及其以前特性
Charging
3.电脑端或者笔记本端显示-缓慢充电
Charging slowly

2. 原理

根据当前的最大电压和电流计算出电流速度,并进行分类为慢速充电,充电,快速充电

2.1 源代码中的原始数据

  • 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层没有使用

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的文件节点

  • 获取当前的电流

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

adb shell cat /sys/class/power_supply/battery/current_max3000000
  • 获取当前的电压

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

adb shell cat /sys/class/power_supply/battery/voltage_max5000000
  • 具体源码

system/core/healthd/BatteryMonitor.cpp

#define POWER_SUPPLY_SYSFS_PATH "/sys/class/" POWER_SUPPLY_SUBSYSTEMpath.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 的算法规则

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

事件接收

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; }

显示字符串

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;        }

转载地址:http://crcti.baihongyu.com/

你可能感兴趣的文章
我和ip_conntrack不得不说的一些事
查看>>
Linux 查看端口使用情况
查看>>
文件隐藏
查看>>
两个linux内核rootkit--之二:adore-ng
查看>>
两个linux内核rootkit--之一:enyelkm
查看>>
关于linux栈的一个深层次的问题
查看>>
rootkit related
查看>>
配置文件的重要性------轻化操作
查看>>
又是缓存惹的祸!!!
查看>>
为什么要实现程序指令和程序数据的分离?
查看>>
我对C++ string和length方法的一个长期误解------从protobuf序列化说起(没处理好会引起数据丢失、反序列化失败哦!)
查看>>
一起来看看protobuf中容易引起bug的一个细节
查看>>
无protobuf协议情况下的反序列化------貌似无解, 其实有解!
查看>>
make -n(仅列出命令, 但不会执行)用于调试makefile
查看>>
makefile中“-“符号的使用
查看>>
go语言如何从终端逐行读取数据?------用bufio包
查看>>
go的值类型和引用类型------重要的概念
查看>>
求二叉树中结点的最大值(所有结点的值都是正整数)
查看>>
用go的flag包来解析命令行参数
查看>>
来玩下go的http get
查看>>