我们所使用的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>复制代码在packages/apps/Settings/res/values/strings.xml中添加:
<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 {复制代码 public static final String NAVIGATION_BAR_SWITCH = "navigation_bar_switch";
// @hide 不可缺少,不然会报错
+ /**
+ *add by lcj 0928
+ *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代码,有很多的不懂之处,向 @同事 请教了很多问题,在他的协助之下,完成了本次工作,特别感谢 @同事 耐心地指导