天天看點

Android P 狀态欄顯示電量百分比

狀态欄預設顯示電量百分比

在Android P 的BatteryMeterView中有內建顯示電量百分比相關代碼,是以我們隻需要将其顯示控制條件預設打開就行。

在Settings的Battery的子頁面中存在一個Battery percentage Switch選項,該選項就是用來控制電量百分比是否顯示在狀态欄的,不過預設是關閉的~

通過Battery percentage Switch選項,可以定位到android\packages\apps\Settings\res\xml\power_usage_summary.xml 檔案,有如下代碼:

<SwitchPreference
        android:key="battery_percentage"
        android:title="@string/battery_percentage"
        android:summary="@string/battery_percentage_description" />
           

根據布局中的key值,可以查詢到該SwitchPreference的控制器類android\packages\apps\Settings\src\com\android\settings\display\BatteryPercentagePreferenceController.java,如下:

public class BatteryPercentagePreferenceController extends AbstractPreferenceController implements
        PreferenceControllerMixin, Preference.OnPreferenceChangeListener {

    private static final String KEY_BATTERY_PERCENTAGE = "battery_percentage";

    public BatteryPercentagePreferenceController(Context context) {
        super(context);
    }

    /**
    *isAvailable傳回值主要控制在Settings的Battery頁面中的
    *Battery percentage Switch選項是否顯示出來
    *
    *傳回false,Battery percentage選項将會被隐藏掉
    *
    *config_battery_percentage_setting_available預設值為true,
    *在android\frameworks\base\core\res\res\values\config.xml中定義。
    */
    @Override
    public boolean isAvailable() {
        return mContext.getResources()
                .getBoolean(R.bool.config_battery_percentage_setting_available);
    }

    @Override
    public String getPreferenceKey() {
        return KEY_BATTERY_PERCENTAGE;
    }

    /**
    *根據SHOW_BATTERY_PERCENT值,更改Switch顯示狀态
    *在沒有取到SHOW_BATTERY_PERCENT值時候,以0為預設值
    * 1:顯示,0:不顯示
    */
    @Override
    public void updateState(Preference preference) {
        int setting = Settings.System.getInt(mContext.getContentResolver(),
                SHOW_BATTERY_PERCENT, 0);

        ((SwitchPreference) preference).setChecked(setting == 1);
    }

    /**
    *根據Switch狀态改變,進而更改SHOW_BATTERY_PERCENT這個系統值
    */
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        boolean showPercentage = (Boolean) newValue;
        Settings.System.putInt(mContext.getContentResolver(), SHOW_BATTERY_PERCENT,
                showPercentage ? 1 : 0);
        return true;
    }
}
           

是以要想電量百分比預設顯示,隻需要找到SHOW_BATTERY_PERCENT預設值設定的地方,然後将其置為1,就預設顯示電量百分比了。

一通查找,然後并沒有發現SHOW_BATTERY_PERCENT賦初值的地方,是以需要自己手動添加一下:

在android/frameworks/base/packages/SettingsProvider/res/values/defaults.xml末尾添加一項:

<!-- Default to show battery percaent on statusbar -->
<integer name="def_show_battery_percent">1</integer>
           

然後該預設值寫到系統資料庫中去:

android/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

private void loadSystemSettings(SQLiteDatabase db) {
        SQLiteStatement stmt = null;
        try {
            stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
                    + " VALUES(?,?);");
            
            loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE,
                    R.bool.def_notification_pulse);

            loadUISoundEffectsSettings(stmt);

            loadIntegerSetting(stmt, Settings.System.POINTER_SPEED,
                    R.integer.def_pointer_speed);

            //為SHOW_BATTERY_PERCENT寫入預設值
            loadIntegerSetting(stmt, Settings.System.SHOW_BATTERY_PERCENT, R.integer.def_show_battery_percent);

            /*
             * IMPORTANT: Do not add any more upgrade steps here as the global,
             * secure, and system settings are no longer stored in a database
             * but are kept in memory and persisted to XML.
             *
             * See: SettingsProvider.UpgradeController#onUpgradeLocked
             */
        } finally {
            if (stmt != null) stmt.close();
        }
    }
           

将SettingsProvider單編,然後push到裝置中,将裝置恢複出廠設定一下,狀态欄顯示電量百分比即可生效了!