1. 程式人生 > >Android6.0電池圖示外顯示電量百分比

Android6.0電池圖示外顯示電量百分比

眾所周知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..876
bd3a 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;
         }
這樣就完成效果了,大家可以試試。
如果需要預設顯示電量的話只需要把各個判定條件交換一下位置就好了。