众所周知Android6.0进入界面后电池电量百分比被隐藏进了调谐者模式里面,即使打开调谐者模式显示电量数字也在电池图标里,对于某些习惯于5.1电量显示的人来说这是一个很难受的事情,那么这里我来提供一个在Setting-电池里增加一个开关来控制电池电量百分比显示的方法:
效果图如下:
开启后:
首先在system_icons.xml电池图标边上增加textview:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lxsbattery"
android:visibility="gone"/>
然后在Setting的power_usage_summary.xml添加开关控制
<CheckBoxPreference
android:key="battery_percentage_on"
android:title="@string/battery_percentage"
android:persistent="false"/>
接着是处理textview显示电量的逻辑代码,systemUI里BatteryController.java这个类是一个广播,专门用于处理电量相关,可以直接从里面获取实时电量,我们可以在里面添加自定义方法传进控件来显示电量
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryCont
index d1b69ab..876bd3a 100755
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -27,9 +27,33 @@ import android.util.Log;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+//by lxs start
+import android.content.ContentResolver;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.view.View;
+import android.widget.TextView;
+import android.provider.Settings;
+import android.util.Log;
+import com.android.systemui.R;
+//by lxs end
public class BatteryController extends BroadcastReceiver {
- private static final String TAG = "BatteryController";
+ //by lxs start
+ //private static final String TAG = "BatteryController";
+ private static final String TAG = "lxs";
+ private TextView mBatteryPercentageView;
+ private boolean mIsShowPercentage = true;
+ private String mPercentage = "100%";
+ private boolean mShowLowPowerModeIndicator;
+ private Context mContext;
+ private final Handler mHandler = new Handler();
+ public void setPercentageView(TextView v) {
+ mBatteryPercentageView = v;
+ }
+ //by lxs end
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private final ArrayList<BatteryStateChangeCallback> mChangeCallbacks = new ArrayList<>();
@@ -40,14 +64,30 @@ public class BatteryController extends BroadcastReceiver {
private boolean mCharging;
private boolean mCharged;
private boolean mPowerSave;
+ //by lxs start
+ private boolean flag;
public BatteryController(Context context) {
+ //by lxs start
+ mContext = context;
+ //by lxs end
mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
-
+ ContentObserver obs = new ContentObserver(mHandler) {
+ @Override
+ public void onChange(boolean selfChange) {
+ updateLowPowerModeIndicator();
+ }
+ };
+
+ final ContentResolver resolver = context.getContentResolver();
+ updateLowPowerModeIndicator();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
+ //by lxs start
+ filter.addAction("android.lxs");
+ //by lxs end
context.registerReceiver(this, filter);
updatePowerSave();
@@ -85,19 +125,56 @@ public class BatteryController extends BroadcastReceiver {
mCharging = mCharged || status == BatteryManager.BATTERY_STATUS_CHARGING;
fireBatteryLevelChanged();
+ //by lxs start
+ int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
+ mPercentage = String.valueOf(mLevel * 100 / scale) + "%";
+ Log.d(TAG, "mPercentage000="+mPercentage);
+ refreshBatteryPercentage();
+ //by lxs end
} else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)) {
updatePowerSave();
} else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING)) {
- setPowerSave(intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false));
+ setPowerSave(intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false)&& mShowLowPowerModeIndicator);
+ }
+ //by lxs start
+ else if (action.equals("android.lxs")) {
+ flag =intent.getBooleanExtra("flag", false);
+ android.util.Log.e(TAG,"收到广播"+flag);
+ if(flag==true){
+ mBatteryPercentageView.setText(mPercentage);
+ mBatteryPercentageView.setVisibility(View.VISIBLE);
+ android.util.Log.e(TAG,"收到广播后true");
+ }else{
+ mBatteryPercentageView.setVisibility(View.GONE);
+ android.util.Log.e(TAG,"收到广播后false");
+ }
+ }
+ //by lxs end
+ }
+ //by lxs start
+ private void updateLowPowerModeIndicator() {
+ final ContentResolver resolver = mContext.getContentResolver();
+ boolean show = true;//Settings.Global.getInt(resolver,
+ // Settings.Global.SHOW_LOW_POWER_MODE_INDICATOR, 1) != 0;
+ if (mShowLowPowerModeIndicator != show) {
+ mShowLowPowerModeIndicator = show;
+ updatePowerSave();
+ }
+ }
+ private void refreshBatteryPercentage() {
+ if (mBatteryPercentageView == null) {
+ Log.d(TAG, "mBatteryPercentageView == null");
+ return;
}
+ final ContentResolver resolver = mContext.getContentResolver();
+ int battery=Settings.Global.getInt(resolver,"lxsbattery", 0);
+ if(battery==1){
+ mBatteryPercentageView.setText(mPercentage);
+mBatteryPercentageView.setVisibility(View.VISIBLE);
+ }else {
+mBatteryPercentageView.setVisibility(View.GONE);
+ }
}
+ //by lxs end
public boolean isPowerSave() {
return mPowerSave;
}
private void updatePowerSave() {
- setPowerSave(mPowerManager.isPowerSaveMode());
+ setPowerSave(mPowerManager.isPowerSaveMode()&& mShowLowPowerModeIndicator);
}
添加的代码逻辑为:在构造方法里初始化我们传进来的textview,这个类可以实时获取到电量而且是一个广播,因此我们可以通过广播来控制是否让传进来的这个textvie显示,自己接受的那个广播是为了实时显示和隐藏,和updateLowPowerModeIndicator()里的判定显示隐藏不冲突,updateLowPowerModeIndicator()里是电量变化一次就执行一次,所以有必要加广播实时控制,接着就是在初始化textview,
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.j
index 81169ea..be3ce81 100755
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -822,6 +822,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mLocationController = new LocationControllerImpl(mContext,
mHandlerThread.getLooper()); // will post a notification
mBatteryController = new BatteryController(mContext);
+ //by lxs start
+ mBatteryController.setPercentageView((TextView) mStatusBarWindow.findViewById(R.id.lxsbattery));
+ //by lxs end
mBatteryController.addStateChangedCallback(new BatteryStateChangeCallback() {
@Override
public void onPowerSaveChanged() {
还有初始化setting的按键并实现点击功能
diff --git a/packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index a267e24..97c2aeb 100755
--- a/packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -102,7 +102,7 @@ public class PowerUsageSummary extends PowerUsageBase {
addPreferencesFromResource(R.xml.power_usage_summary);
/* SPRD: add by Bug 494158, remove battery level percent feature @{ */
//SPRD:Bug475755 Add battery level percent feature
- //mBatteryPercentagePref = (CheckBoxPreference) findPreference(KEY_BATTERY_PERCENTAGE);
+ mBatteryPercentagePref = (CheckBoxPreference) findPreference(KEY_BATTERY_PERCENTAGE);
+ int battery=Settings.Global.getInt(getActivity().getContentResolver(),"lxsbattery", 0);
+ if(battery==1){
+ mBatteryPercentagePref.setChecked(true);
+ }else{
+ mBatteryPercentagePref.setChecked(false);
+ }
/* @} */
mHistPref = (BatteryHistoryPreference) findPreference(KEY_BATTERY_HISTORY);
mAppListGroup = (PreferenceGroup) findPreference(KEY_APP_LIST);
@@ -151,6 +151,23 @@ public class PowerUsageSummary extends PowerUsageBase {
}*/
/* @} */
/* @} */
+ //by lxs start
+ if (mBatteryPercentagePref == preference) {
+ android.util.Log.e("lxs","点击了");
+ if(mBatteryPercentagePref.isChecked()){
+ Intent intent = new Intent("android.lxs");
+ intent.putExtra("flag", true);
+ getActivity().sendBroadcast(intent);
+ android.util.Log.e("lxs","选中的广播");
+ Settings.Global.putInt(getActivity().getContentResolver(),"lxsbattery",1);
+ }else{
+ Intent intent = new Intent("android.lxs");
+ intent.putExtra("flag", false);
+ getActivity().sendBroadcast(intent);
+ android.util.Log.e("lxs","没选中的广播");
+ Settings.Global.putInt(getActivity().getContentResolver(),"lxsbattery",0);
+ }
+ //by lxs end
+ return true;
+ }
if (!(preference instanceof PowerGaugePreference)) {
return false;
}
这样就完成效果了,大家可以试试。
如果需要默认显示电量的话只需要把各个判定条件交换一下位置就好了。