您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎么在Android 8.0中實現慢充和快充提示語,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
1. 慢充和快充提示語
\frameworks\base\packages\SystemUI\res-keyguard\values-zh-rCN
中文提示語
<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.快充充電器充電-顯示快速充電字符串
<!-- 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及其以前特性
<!-- 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.電腦端或者筆記本端顯示-緩慢充電
<!-- 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 源代碼中的原始數據
?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_max 30000001
?獲取當前的電壓
adb shell cat /sys/class/power_supply/battery/voltage_max adb shell cat /sys/class/power_supply/battery/voltage_max 50000001
?具體源碼
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 的算法規則
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; }
看完上述內容,你們對怎么在Android 8.0中實現慢充和快充提示語有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。