SystemUI状态栏添加电量百分比显示

OS: MTK 6.0

1.添加一个控制显示的开关
  • 源码路径:/packages/apps/Settings/src/com/mediatek/settings/fuelgauge/PowerUsageExts.java
    在setting中电量设置项新增一项
  public void initPowerUsageExtItems() {
 		 ...
     // add  for battery percentage   
     mBatteryPercentPrf = new SwitchPreference(mContext);
     mBatteryPercentPrf.setKey(KEY_BATTERY_PERCENTAGE_ENABLE);
     mBatteryPercentPrf.setTitle(R.string.battery_percentage_title);
     mBatteryPercentPrf.setOrder(PREFERENCE_ORDER_FIRST);
     mBatteryPercentPrf.setChecked(true);
     mPowerUsageScreen.addPreference(mBatteryPercentPrf);
  	 //add end
  }
   
  public boolean onPowerUsageExtItemsClick(PreferenceScreen preferenceScreen
       		 Preference preference) {
     // add by wxd for battery percentage
     if (KEY_BATTERY_PERCENTAGE_ENABLE.equals(preference.getKey())) {
         if (preference instanceof SwitchPreference) {
             SwitchPreference pref = (SwitchPreference) preference;
             int bgState = pref.isChecked() ? 1 : 0;
             Log.d(TAG, "battery percentage enable state: " + bgState);
             Settings.System.putInt(mContext.getContentResolver(),
                         "BATTERY_PERCENTAGE_ENABLE", bgState);
                         
             Intent intent = new Intent(ACTION_BATTERY_PERCENTAGE_ENABLE);
             mContext.sendBroadcast(intent);     // 状态发生变化发送广播,显示或隐藏电量百分比
             
             if (mBatteryPercentPrf != null) {
                 mBatteryPercentPrf.setChecked(pref.isChecked());
             }       
          }
          return true;
      }
      //add end 		 
2.添加电量显示的textview
  • 源码路径:/frameworks/base/packages/SystemUI/res/layout/status_bar.xml
 <include layout="@layout/system_icons" />
 
 <TextView android:id="@+id/battery_level"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center_vertical"
      android:paddingEnd="@dimen/battery_level_padding_end"
      android:textColor="#ffffff"
      android:visibility="gone"
      android:textSize="@dimen/battery_level_text_size"
      android:importantForAccessibility="noHideDescendants"/>
3.电量显示
  • 源码路径:/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
    PhoneStatusBar中有个电量变化的监听回调
  protected PhoneStatusBarView makeStatusBarView() {
 		 ...
    battery_level_tv = (TextView)mStatusBarView.findViewById(R.id.battery_level);  // add
   		 ...
   	mBatteryController.addStateChangedCallback(new BatteryStateChangeCallback() {
          @Override
          public void onPowerSaveChanged() {   // 省电模式变化
             mHandler.post(mCheckBarModes);
             if (mDozeServiceHost != null) {
                 mDozeServiceHost.firePowerSaveChanged(mBatteryController.isPowerSave());
             }
          }
          
          @Override
          public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {    // 电量变化回调
                // add start
             percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);
             isBatteryPercentage = Settings.System.getInt(mContext.getContentResolver(),
                    "BATTERY_PERCENTAGE_ENABLE", 1) != 0;
             refreshBatteryPercentage();
               // add end
          }
    });	 
         ...
     // add 注册电量显示开关使能广播
    IntentFilter batteryPercentfilter = new IntentFilter();
    batteryPercentfilter.addAction(ACTION_BATTERY_PERCENTAGE_ENABLE);
    context.registerReceiver(mBatteryPercentReceiver, batteryPercentfilter);
     //add end    
     		...
  }

  // add for battery percentage
   private void refreshBatteryPercentage(){
      if (isBatteryPercentage) {
          battery_level_tv.setText(percentage);
          battery_level_tv.setVisibility(View.VISIBLE);
      } else {
          battery_level_tv.setVisibility(View.GONE);
      }
   }

   private TextView battery_level_tv;
   private String percentage;
   private boolean isBatteryPercentage = false;
   private static final String ACTION_BATTERY_PERCENTAGE_ENABLE = "action_battery_percentage_enable";

   private BroadcastReceiver mBatteryPercentReceiver = new BroadcastReceiver() {
   		 @Override
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
             if (ACTION_BATTERY_PERCENTAGE_ENABLE.equals(action)) {
                if (battery_level_tv == null) {
                    battery_level_tv = (TextView)mStatusBarView.findViewById(R.id.battery_level);
                } 
                isBatteryPercentage = Settings.System.getInt(mContext.getContentResolver(),
                    "BATTERY_PERCENTAGE_ENABLE", 1) != 0;
                refreshBatteryPercentage();
             }
         }
   };
     // add end

其实,上面的mBatteryController是一个广播,监听电量变化的广播Intent.ACTION_BATTERY_CHANGED

  • 源码路径:/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController
<think> 我们正在寻找Android 8.1系统中状态栏显示电池电量百分比开关的判断条件。 根据引用[1]和引用[3]中的信息,我们可以得知: 在引用[1]中提到:设置 Settings.System.SHOW_BATTERY_PERCENT 监听,当用户点击了显示电量百分比开关,则调用 updateShowPercent()方法在电池等级前添加电量百分比。 在引用[3]中有一条注释的代码://mShouldShowBatteryPercentage = (Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.BATTERY_PERCENTAGE, 0) != 0); 注意,引用[3]中使用的设置项是Settings.Secure.BATTERY_PERCENTAGE,而引用[1]中用的是Settings.System.SHOW_BATTERY_PERCENT。 我们需要确定在Android 8.1中到底使用的是哪个设置项。 回顾引用[1]的原文: “设置 Settings.System.SHOW_BATTERY_PERCENT 监听,当用户点击了显示电量百分比开关,则调用 updateShowPercent()方法” 另外,引用[3]的代码片段虽然被注释掉了,但说明曾经使用过Settings.Secure.BATTERY_PERCENTAGE。 在Android的不同版本中,这个设置项可能会发生变化。根据Android官方文档,电池百分比的设置在不同版本中确实有不同的处理。 我们注意到引用[1]是来自Android8.1的SystemUI源码分析,因此我们应优先考虑引用[1]中的信息。 因此,判断条件可能是通过查询Settings.System中的SHOW_BATTERY_PERCENT的值。 具体来说,判断条件为: Settings.System.getInt(context.getContentResolver(), Settings.System.SHOW_BATTERY_PERCENT, 0) != 0 但是,我们也要注意,在Android中,系统设置分为System、Secure、Global等不同命名空间。电池百分比显示设置通常是一个可以由用户修改的设置,而且它不是一个安全相关的设置,所以放在System命名空间是合理的。 另外,引用[3]中提到的是MTK修改默认显示电池百分比,它使用了Secure命名空间,这可能是一个厂商定制行为,或者是旧版本的实现。在Android 8.1的AOSP中,我们应该以System命名空间为准。 综上所述,在Android 8.1 AOSP中,状态栏显示电池电量百分比的开关判断条件应为: Settings.System.getInt(resolver, Settings.System.SHOW_BATTERY_PERCENT, 0) != 0 但是,为了确保准确性,我们可以参考AOSP源码。由于我们无法直接运行代码,我们可以根据引用[1]中提到的文件路径进行推理。 引用[1]提到:packages\apps\SettingsLib\src\com\android\settingslib\graph\BatteryMeterDrawableBase.java 在Android 8.1的AOSP源码中,我们可以查看这个文件(虽然我们手头没有源码,但根据分析,引用[1]是可靠的)。 根据引用[1]的描述,在BatteryMeterDrawableBase的构造方法中,他们设置了监听Settings.System.SHOW_BATTERY_PERCENT,并调用updateShowPercent()方法。因此,我们可以确定使用的是Settings.System.SHOW_BATTERY_PERCENT。 因此,回答如下: </think> 在Android 8.1系统中,状态栏显示电池电量百分比开关的判断条件主要基于系统设置中的特定键值。以下是核心实现逻辑的分析: ### 关键判断条件 1. **系统设置键值** 系统通过查询 `Settings.System.SHOW_BATTERY_PERCENT` 的值决定是否显示电量百分比: ```java int showPercent = Settings.System.getInt( context.getContentResolver(), Settings.System.SHOW_BATTERY_PERCENT, 0 // 默认值(0表示关闭) ); ``` 当该值为 **1** 时启用百分比显示,为 **0** 时关闭[^1]。 2. **实时监听机制** SystemUI 注册了对此键值的监听器,当用户通过设置界面切换开关时,会触发 `updateShowPercent()` 方法实时更新状态栏显示[^1]。 ### 实现原理 - **代码位置** 核心逻辑位于 `BatteryMeterDrawableBase.java` 中(路径:`packages/apps/SettingsLib/src/com/android/settingslib/graph/`)[^1]。 - **布局控制** 电量百分比以 `TextView` 形式动态添加在电池图标(`ImageView`)左侧,通过 `ViewGroup` 管理布局层级[^1]。 - **主题适配** 通过 `onDarkChanged()` 方法实现亮色/暗色主题切换时的颜色适配[^1]。 ### 与其他版本差异 - 对比 Android 7.1 的自动背光控制(通过 `Power` 和 `Lights` 服务交互[^2]),8.1 的电量百分比属于纯 UI 层逻辑。 - 某些厂商定制 ROM(如 MTK)可能使用 `Settings.Secure.BATTERY_PERCENTAGE`[^3],但 AOSP 原生实现统一采用 `Settings.System` 命名空间。 > **总结**:判断条件直接取决于 `Settings.System.SHOW_BATTERY_PERCENT` 的系统设置值,该键值映射到"设置-电池-电量百分比显示"开关的用户操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值