栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android 8.0 慢充和快充提示语的实现原理

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android 8.0 慢充和快充提示语的实现原理

1. 慢充和快充提示语

frameworksbasepackagesSystemUIres-keyguardvalues-zh-rCN

中文提示语

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

英文提示语

frameworksbasepackagesSystemUIres-keyguardvalues

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/156172.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号