让状态栏上有显示电池电量百分比

版权声明:版权所有,转载请注明出处,感谢阅读 https://blog.csdn.net/m0_37526672/article/details/80334724

我们所使用的Android手机的状态栏上,一般都有电池电量百分比的显示,方便用户知悉手机剩余百分之多少电量!我们的P6S手持机和ITAB-01平板上需要下拉状态栏才能看到电池电量百分比:


为了让用户能够更直观的看到我们的产品上电池的使用情况,我在状态栏上添加了电池电量百分比的显示。
 
过程如下:
一、状态栏显示
1. 为了给显示电池电量百分比在状态栏上布局,在frameworks/base/packages/SystemUI/res/layout/status_bar.xml 中添加:
  1.              <include layout="@layout/system_icons" />

  2. +            <TextView android:id="@+id/battery_level"
  3. +            android:layout_width="wrap_content"
  4. +            android:layout_height="wrap_content"
  5. +            android:layout_marginStart="@dimen/header_battery_margin_expanded"
  6. +            android:textColor="#ffffff"
  7. +            android:textSize="@dimen/battery_level_text_size"
  8. +            android:gravity="center_vertical"
  9. +            android:text="@string/battery_level_text" />
  10. +
复制代码

2. 为了使百分比显示的字体大小和时钟一样,在frameworks/base/packages/SystemUI/res/values/dimens.xml 中改变字体大小:
  1.      <!-- The text size for battery level -->
  2. -    <dimen name="battery_level_text_size">12sp</dimen>
  3. +    <dimen name="battery_level_text_size">14sp</dimen>
复制代码

3.为了能够在状态栏上显示电池电量百分比(逻辑处理),在 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java 中添加:
  1. @@ -203,6 +203,7 @@ import java.util.Map;

  2. +import java.text.NumberFormat;

  3. @@ -363,6 +364,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,

  4. +    private TextView mBatteryLevel;

  5. @@ -877,6 +879,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,

  6. +        mBatteryLevel = (TextView) mStatusBarView.findViewById(R.id.battery_level);
  7.          mBatteryController.addStateChangedCallback(new BatteryStateChangeCallback() {

  8. +                String percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);
  9. +                mBatteryLevel.setText(percentage);

复制代码

二、添加开关
有些用户可能不想看到状态栏上有电池电量百分比的显示,为了更人性化,我添加了“电池电量”开关:
 
1. 为了显示电量百分比的开关提示信息,在 packages/apps/Settings/res/values-zh-rCN/strings.xml 中添加:
  1. <string name="imei_information_title" msgid="8499085421609752290">"IMEI信息"</string>
  2.      <string name="imei_information_summary" msgid="2074095606556565233">"IMEI相关信息"</string>
  3.      <string name="slot_number" msgid="3762676044904653577">"(插槽<xliff:g id="SLOT_NUM">%1$d</xliff:g>)"</string>
  4. +    <!-- Title for battery level -->
  5. +    <string name="battery_level_title">电量百分比</string>
复制代码
  在packages/apps/Settings/res/values/strings.xml中添加:
  1. <string name="imei_information_summary">IMEI relative information</string>
  2.     <string name="slot_number">(Slot<xliff:g id="slot_num">%1$d</xliff:g>)</string>

  3. +    <!-- Title for battery level -->
  4. +    <string name="battery_level_title">battery_level</string>
复制代码

2. 为了将开/关状态关联到状态栏,进行逻辑处理,在 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java 中添加:
  1. +    private BatteryLevelSet mBatteryLevelSet;
  2. +    public class BatteryLevelSet extends BroadcastReceiver {
  3. +        @Override
  4. +        public void onReceive(Context context, Intent intent) {
  5. +            boolean hasChecked = intent.getExtras().getBoolean("checked", true);
  6. +            if (hasChecked){
  7. +                mBatteryLevel.setVisibility(View.VISIBLE);
  8. +            } else {
  9. +                mBatteryLevel.setVisibility(View.GONE);
  10. +            }
  11. +        }
  12. +    }

  13.          mScreenPinningRequest = new ScreenPinningRequest(mContext);
  14. +
  15. +        mBatteryLevelSet = new BatteryLevelSet();
  16. +        IntentFilter filter = new IntentFilter();
  17. +        filter.addAction("com.raindi.battery.level");
  18. +        mContext.registerReceiver(mBatteryLevelSet, filter);

  19.          mContext.unregisterReceiver(mBroadcastReceiver);
  20. +        mContext.unregisterReceiver(mBatteryLevelSet);
复制代码

3. 在设置中,对开/关((BATTERY_LEVEL_KEY)事件进行处理,因此,在 packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java 中添加:
  1. +import android.preference.SwitchPreference;

  2. +    private SwitchPreference mBatteryPercentage;
  3. +    private static String BATTERY_LEVEL_KEY = "battery_level_key";

  4. +        findPreference(BATTERY_LEVEL_KEY).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
  5. +                 @Override
  6. +                 public boolean onPreferenceChange(Preference preference, Object o) {
  7. +                     Intent intent = new Intent();
  8. +                     intent.setAction("com.raindi.battery.level");
  9. +                     intent.putExtra("checked", (boolean)o);
  10. +                     getActivity().sendBroadcast(intent);
  11. +                     return true;
  12. +                 }
  13. +             });
  14. +

  15. +        mBatteryPercentage = new SwitchPreference(getActivity());
  16. +        mBatteryPercentage.setKey(BATTERY_LEVEL_KEY);
  17. +        mBatteryPercentage.setTitle(getActivity().getString(R.string.battery_level_title));
  18. +        mBatteryPercentage.setDefaultValue(true);
  19. +        mAppListGroup.addPreference(mBatteryPercentage);
复制代码

三、在添加“电池电量开/关”后,经过测试,发现问题:电量百分比为"关"时,手机重新开机后,状态栏上仍然还有电量百分比显示,解决问题的方法是:将电量百分比“开/关”状态关联到数据库。
1. 在frameworks/base/core/java/android/provider/Settings.java中添加:
  1. <blockquote>@@ -3846,6 +3846,13 @@ public final class Settings {
复制代码
         public static final String NAVIGATION_BAR_SWITCH = "navigation_bar_switch";
// @hide 不可缺少,不然会报错
+         /**
+          *  add by lcj 20170928
+          *  BATTERY_LEVEL_SWITCH for battery_level_switch
+          *  @hide
+          */

+         public static final String BATTERY_LEVEL_SWITCH = "battery_level_switch";

2. 为了在设置中默认是在状态栏中显示电池电量,因此在 frameworks/base/packages/SettingsProvider/res/values/defaults.xml 中添加:
  1. frameworks/base/packages/SettingsProvider/res/values/defaults.xml
复制代码

3. 关联数据库,在 frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 中添加:
  1. <blockquote>@@ -2367,6 +2367,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
复制代码

4. 状态栏显示逻辑,在 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java 中添加:
  1. @@ -227,6 +227,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
  2.      public static final String NAVIGATION_BAR_SWITCH = "navigation_bar_switch";
  3.      public static final String ACTION_NAVIGATION_BAR  = "android.intent.action.NAVIGATION_BAR";

  4. +    public static final String BATTERY_LEVEL_SWITCH = "battery_level_switch";
  5. +    public static final String ACTION_BATTERY_LEVEL = "com.raindi.battery.level";
  6. +
  7.      public static final boolean SHOW_LOCKSCREEN_MEDIA_ARTWORK = true;

  8.      private static final int MSG_OPEN_NOTIFICATION_PANEL = 1000;
  9. @@ -621,11 +624,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
  10.           @Override
  11.           public void onReceive(Context context, Intent intent) {
  12.              boolean hasChecked = intent.getExtras().getBoolean("checked", true);
  13. +            int batteryLevelSwitch = 1;
  14.              if (hasChecked){
  15. +                batteryLevelSwitch = 1;
  16.                  mBatteryLevel.setVisibility(View.VISIBLE);
  17.              } else {
  18. +                batteryLevelSwitch = 0;
  19.                  mBatteryLevel.setVisibility(View.GONE);
  20.              }
  21. +            Settings.System.putInt(mContext.getContentResolver(),BATTERY_LEVEL_SWITCH, batteryLevelSwitch);
  22.           }
  23.      }

  24. @@ -683,7 +690,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,

  25.          mBatteryLevelSet = new BatteryLevelSet();
  26.          IntentFilter filter = new IntentFilter();
  27. -        filter.addAction("com.raindi.battery.level");
  28. +        filter.addAction(ACTION_BATTERY_LEVEL);
  29.          mContext.registerReceiver(mBatteryLevelSet, filter);
  30.      }

  31. @@ -901,6 +908,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
  32.          Xlog.d(TAG, "makeStatusBarView : BatteryController");
  33.          mBatteryController = new BatteryController(mContext);
  34.          mBatteryLevel = (TextView) mStatusBarView.findViewById(R.id.battery_level);
  35. +        int ret =  Settings.System.getInt(mContext.getContentResolver(),BATTERY_LEVEL_SWITCH, 1);
  36. +        if(ret == 1) {
  37. +            mBatteryLevel.setVisibility(View.VISIBLE);
  38. +        } else {
  39. +            mBatteryLevel.setVisibility(View.GONE);
  40. +        }
复制代码

这是自己首次修改JAVA代码,有很多的不懂之处,向 @同事 请教了很多问题,在他的协助之下,完成了本次工作,特别感谢 @同事 耐心指导
阅读更多

没有更多推荐了,返回首页