我们所使用的Android手机的状态栏上,一般都有电池电量百分比的显示,方便用户知悉手机剩余百分之多少电量!我们的P6S手持机和ITAB-01平板上需要下拉状态栏才能看到电池电量百分比:
为了让用户能够更直观的看到我们的产品上电池的使用情况,我在状态栏上添加了电池电量百分比的显示。
过程如下:
一、状态栏显示
1. 为了给显示电池电量百分比在状态栏上布局,在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_marginStart="@dimen/header_battery_margin_expanded"
- + android:textColor="#ffffff"
- + android:textSize="@dimen/battery_level_text_size"
- + android:gravity="center_vertical"
- + android:text="@string/battery_level_text" />
- +
2. 为了使百分比显示的字体大小和时钟一样,在frameworks/base/packages/SystemUI/res/values/dimens.xml 中改变字体大小:
- <!-- The text size for battery level -->
- - <dimen name="battery_level_text_size">12sp</dimen>
- + <dimen name="battery_level_text_size">14sp</dimen>
3.为了能够在状态栏上显示电池电量百分比(逻辑处理),在 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java 中添加:
- @@ -203,6 +203,7 @@ import java.util.Map;
- +import java.text.NumberFormat;
- @@ -363,6 +364,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
- + private TextView mBatteryLevel;
- @@ -877,6 +879,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
- + mBatteryLevel = (TextView) mStatusBarView.findViewById(R.id.battery_level);
- mBatteryController.addStateChangedCallback(new BatteryStateChangeCallback() {
- + String percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);
- + mBatteryLevel.setText(percentage);
二、添加开关
有些用户可能不想看到状态栏上有电池电量百分比的显示,为了更人性化,我添加了“电池电量”开关:
1. 为了显示电量百分比的开关提示信息,在 packages/apps/Settings/res/values-zh-rCN/strings.xml 中添加:
- <string name="imei_information_title" msgid="8499085421609752290">"IMEI信息"</string>
- <string name="imei_information_summary" msgid="2074095606556565233">"IMEI相关信息"</string>
- <string name="slot_number" msgid="3762676044904653577">"(插槽<xliff:g id="SLOT_NUM">%1$d</xliff:g>)"</string>
- + <!-- Title for battery level -->
- + <string name="battery_level_title">电量百分比</string>
- <string name="imei_information_summary">IMEI relative information</string>
- <string name="slot_number">(Slot<xliff:g id="slot_num">%1$d</xliff:g>)</string>
- + <!-- Title for battery level -->
- + <string name="battery_level_title">battery_level</string>
2. 为了将开/关状态关联到状态栏,进行逻辑处理,在 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java 中添加:
- + private BatteryLevelSet mBatteryLevelSet;
- + public class BatteryLevelSet extends BroadcastReceiver {
- + @Override
- + public void onReceive(Context context, Intent intent) {
- + boolean hasChecked = intent.getExtras().getBoolean("checked", true);
- + if (hasChecked){
- + mBatteryLevel.setVisibility(View.VISIBLE);
- + } else {
- + mBatteryLevel.setVisibility(View.GONE);
- + }
- + }
- + }
- mScreenPinningRequest = new ScreenPinningRequest(mContext);
- +
- + mBatteryLevelSet = new BatteryLevelSet();
- + IntentFilter filter = new IntentFilter();
- + filter.addAction("com.raindi.battery.level");
- + mContext.registerReceiver(mBatteryLevelSet, filter);
- mContext.unregisterReceiver(mBroadcastReceiver);
- + mContext.unregisterReceiver(mBatteryLevelSet);
3. 在设置中,对开/关((BATTERY_LEVEL_KEY)事件进行处理,因此,在 packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java 中添加:
- +import android.preference.SwitchPreference;
- + private SwitchPreference mBatteryPercentage;
- + private static String BATTERY_LEVEL_KEY = "battery_level_key";
- + findPreference(BATTERY_LEVEL_KEY).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
- + @Override
- + public boolean onPreferenceChange(Preference preference, Object o) {
- + Intent intent = new Intent();
- + intent.setAction("com.raindi.battery.level");
- + intent.putExtra("checked", (boolean)o);
- + getActivity().sendBroadcast(intent);
- + return true;
- + }
- + });
- +
- + mBatteryPercentage = new SwitchPreference(getActivity());
- + mBatteryPercentage.setKey(BATTERY_LEVEL_KEY);
- + mBatteryPercentage.setTitle(getActivity().getString(R.string.battery_level_title));
- + mBatteryPercentage.setDefaultValue(true);
- + mAppListGroup.addPreference(mBatteryPercentage);
三、在添加“电池电量开/关”后,经过测试,发现问题:电量百分比为"关"时,手机重新开机后,状态栏上仍然还有电量百分比显示,解决问题的方法是:将电量百分比“开/关”状态关联到数据库。
1. 在frameworks/base/core/java/android/provider/Settings.java中添加:
- <blockquote>@@ -3846,6 +3846,13 @@ public final class Settings {
// @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 中添加:
- frameworks/base/packages/SettingsProvider/res/values/defaults.xml
3. 关联数据库,在 frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 中添加:
- <blockquote>@@ -2367,6 +2367,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
4. 状态栏显示逻辑,在 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java 中添加:
- @@ -227,6 +227,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
- public static final String NAVIGATION_BAR_SWITCH = "navigation_bar_switch";
- public static final String ACTION_NAVIGATION_BAR = "android.intent.action.NAVIGATION_BAR";
- + public static final String BATTERY_LEVEL_SWITCH = "battery_level_switch";
- + public static final String ACTION_BATTERY_LEVEL = "com.raindi.battery.level";
- +
- public static final boolean SHOW_LOCKSCREEN_MEDIA_ARTWORK = true;
- private static final int MSG_OPEN_NOTIFICATION_PANEL = 1000;
- @@ -621,11 +624,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
- @Override
- public void onReceive(Context context, Intent intent) {
- boolean hasChecked = intent.getExtras().getBoolean("checked", true);
- + int batteryLevelSwitch = 1;
- if (hasChecked){
- + batteryLevelSwitch = 1;
- mBatteryLevel.setVisibility(View.VISIBLE);
- } else {
- + batteryLevelSwitch = 0;
- mBatteryLevel.setVisibility(View.GONE);
- }
- + Settings.System.putInt(mContext.getContentResolver(),BATTERY_LEVEL_SWITCH, batteryLevelSwitch);
- }
- }
- @@ -683,7 +690,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
- mBatteryLevelSet = new BatteryLevelSet();
- IntentFilter filter = new IntentFilter();
- - filter.addAction("com.raindi.battery.level");
- + filter.addAction(ACTION_BATTERY_LEVEL);
- mContext.registerReceiver(mBatteryLevelSet, filter);
- }
- @@ -901,6 +908,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
- Xlog.d(TAG, "makeStatusBarView : BatteryController");
- mBatteryController = new BatteryController(mContext);
- mBatteryLevel = (TextView) mStatusBarView.findViewById(R.id.battery_level);
- + int ret = Settings.System.getInt(mContext.getContentResolver(),BATTERY_LEVEL_SWITCH, 1);
- + if(ret == 1) {
- + mBatteryLevel.setVisibility(View.VISIBLE);
- + } else {
- + mBatteryLevel.setVisibility(View.GONE);
- + }
这是自己首次修改JAVA代码,有很多的不懂之处,向 @同事 请教了很多问题,在他的协助之下,完成了本次工作,特别感谢 @同事 耐心地指导