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

(0)

相关推荐

  • Android注解使用之ButterKnife 8.0详解

    前言: App项目开发大部分时候还是以UI页面为主,这时我们需要调用大量的findViewById以及setOnClickListener等代码,控件的少的时候我们还能接受,控件多起来有时候就会有一种想砸键盘的冲动.所以这个时候我们想着可以借助注解的方式让我们从这种繁重的工作中脱离出来,也让代码变得更加简洁,便于维护,今天主要学习一下只专注View.Resource.Action注解框架ButterKnife. ButterKnife介绍 ButterKnife是一个专注于Android系统的V

  • Android 8.0系统中应用图标的适配微技巧

    现在已经进入了2018年,Android 8.0系统也逐渐开始普及起来了.三星今年推出的最新旗舰机Galaxy S9已经搭载了Android 8.0系统,紧接着小米.华为.OV等国产手机厂商即将推出的新年旗舰机也会搭载Android 8.0系统.因此,现在已经是时候需要让我们的应用程序对Android 8.0系统进行适配了. 其实在去年Android 8.0系统刚推出的时候,我就仔细翻阅过Google官方的功能变更文档.变更项着实不少,但是真正需要我们去进行功能适配的地方却并不多.总结了一下,最

  • Android 8.0 中如何实现视频通话的画中画模式的示例

    Android 8.0 当中允许 Activiy 以画中画模式展现.这是一种多窗口模式的改进加强,在视频类应用中用处非常大,有了这种模式,就可以在视频通话或者观看直播的过程当中打开另外的应用而不用退出当前视频.更详细的就不再累述了,大家去阅读官方文档 就行 这里以 Agora SDK 为例来给大家展示下该特性,实际上不用 Agora SDK 做任何修改. 准备环境 Android 8.0 或以上版本手机 Agora SDK 1.14.0 或以上 版本 Android Studio 3.0 或以上

  • Android 8.0安装apk的实例代码

    android 8.0安装apk需要请求未知来源权限 //xml配置 <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> /** * 检测版本8.0 */ public void checkOreo() { if (SdkVersionUtils.hasOreo()) {//8.0 //判断是否可以直接安装 boolean canInstall = getPackageM

  • Android 8.0系统中通知栏的适配微技巧

    大家好,今天我们继续来学习Android 8.0系统的适配. 之前我们已经讲到了,Android 8.0系统最主要需要进行适配的地方有两处:应用图标和通知栏.在上一篇文章当中,我们学习了Android 8.0系统应用图标的适配,还没有看过这篇文章的朋友可以先去阅读 Android应用图标微技巧,8.0系统中应用图标的适配 . 那么本篇文章,我们自然要将重点放在通知栏上面了,学习一下Android 8.0系统的通知栏适配. 其实在8.0系统之前,还有一次通知栏变动比较大的版本,就是5.0系统.关于

  • Android 8.0系统中通知栏的适配详解

    大家好,今天我们继续来学习Android 8.0系统的适配. 之前我们已经讲到了,Android 8.0系统最主要需要进行适配的地方有两处:应用图标和通知栏.在上一篇文章当中,我们学习了Android 8.0系统应用图标的适配,还没有看过这篇文章的朋友可以先去阅读 Android应用图标微技巧,8.0系统中应用图标的适配 . 那么本篇文章,我们自然要将重点放在通知栏上面了,学习一下Android 8.0系统的通知栏适配. 其实在8.0系统之前,还有一次通知栏变动比较大的版本,就是5.0系统.关于

  • 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&

  • Android Studio 3.0被调方法参数名提示的取消方法

    android studio升级3.0之后, 代码中调用的方法增加了参数名提示: 很多人不习惯这个提示,我们来看看怎么取消这个提示: PS:下面看下Android Studio 3.0 gradle提示太老 解决方法 The android gradle plugin version 3.0.0-alpha1 is too old, please update to the latest version. To override this check from the command line

  • Android 6.0指纹识别App开发案例

    在android 6.0中google终于给android系统加上了指纹识别的支持,这个功能在iPhone上早就已经实现了,并且在很多厂商的定制的ROM中也都自己内部实现这个功能了,这个功能来的有点晚啊.在google全新发布的nexus设备:nexus 5x和nexus 6p中都携带了一颗指纹识别芯片在设备的背面,如下图(图片来自网络): 笔者手中的设备就是图上的那台黑色的nexus 5x,话说这台机器很是好看呢!手感超棒! 废话不多说,下面我出一个指纹识别的demo app,并且详细说明怎么

  • Android Studio3.0新特性及安装图文教程

    Android Studio是Android的官方IDE.它是专为Android而打造,可以加快您的开发速度,帮助您为每款Android设备构建最优应用. 它提供专为Android开发者量身定制的工具,其中包括丰富的代码编辑.调试.测试和性能分析工具. 一.Android Studio3.0新特性 (1).核心IDE更改 我们将基础IDE从IntelliJ 2016.2升级到2017.1.2,在2016.3和 2017.1中增加了许多新功能, 包括参数提示,语义突出显示,搜索中的即时结果等等.

  • Android 7.0 Nougat不得不知的11项新功能

    最近 Google 已经发布 Android 新版本 7.0 Nougat (牛轧糖) ,相信Android手机用户在未来的几个月内会收到第三方手机制造商推送的系统升级,无论你是已经下载升级的幸运者,还是焦急等待更新的用户,Android 7.0 Nougat 都有一些很棒的功能值得尝试,下面是11 项 在 Android 7.0 Nougat 系统中不可错过的功能. 1) 同时运行多个应用 Android 终于正式地支持分屏模式,通过分屏模式可以同时打开两个应用,这个功能在平板上使用起来特别方

  • 用Android Studio3.0新功能加快构建速度

    Android Studio3.0很多新的功能,他们可以直接加快Android Studio的构建速度从而加快开发效率,构建速度直接影响到开发效率,浪费时间即浪费生命,可以通过修改一些配置,优化下构建速度. Android Studio3.0之前的做法 通过配置DEX 资源缩短构建时间 gradle 添加以下代码 android { ... dexOptions { maxProcessCount 4 // this is the default value javaMaxHeapSize "2

  • Android 8.0系统中应用图标的适配技巧

    现在已经进入了2018年,Android 8.0系统也逐渐开始普及起来了.三星今年推出的最新旗舰机Galaxy S9已经搭载了Android 8.0系统,紧接着小米.华为.OV等国产手机厂商即将推出的新年旗舰机也会搭载Android 8.0系统.因此,现在已经是时候需要让我们的应用程序对Android 8.0系统进行适配了. 其实在去年Android 8.0系统刚推出的时候,我就仔细翻阅过Google官方的功能变更文档.变更项着实不少,但是真正需要我们去进行功能适配的地方却并不多.总结了一下,最

  • 详解升级Android Studio3.0时遇到的几个问题

    今天收到了Android Studio3.0更新推送,在升级过程中遇到几个问题,在这里把问题和解决方法记录下,方便要升级的童鞋.如果还有童鞋遇到不同的问题,也可以评论下我做下记录 1.gradle打包,自定义apk名称代码报错(Cannot set the value of read-only property 'outputFile' ) 报错 Error:(56, 0) Cannot set the value of read-only property 'outputFile' for

  • Android 6.0调用相机图册崩溃的完美解决方案

    最近客户更新系统发现,以前的项目在调用相机的时候,闪退掉了,很奇怪,后来查阅后发现,Android 6.0以后需要程序授权相机权限,默认会给出提示,让用户授权,个人感觉这一特性很好,大概如下: 导入Android V4, V7包! Android Studio 导入很简单,右键项目后找到dependency就ok了. 继承AppCompatActivity public class MainActivity extends AppCompatActivity 引入需要的类库 import and

随机推荐