300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 让状态栏上有显示电池电量百分比

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

时间:2024-01-27 10:44:55

相关推荐

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

我们所使用的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代码,有很多的不懂之处,向 @同事 请教了很多问题,在他的协助之下,完成了本次工作,特别感谢 @同事 耐心地指导

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。