问题:开机重启后,无法获取具体电量值。

分析:基本上应用层电量的获取都是依靠电量广播Intent.ACTION_BATTERY_CHANGED来获取,当开机时,batteryservice.java会获取底层上传的电量信息并发送广播,但此时状态栏的电量百分比java类并未实例化没有及时获取到对应电量信息,当完成实例化进行展示,电量level为0故不展示。

对应的类流程:frameworks/base/services/core/java/com/android/server/BatteryService.java ->

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java ->frameworks/base/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java 

解决:可以在BatteryControllerImpl.java中对BatteryMeterView.java注册时进行处理,当BatteryMeterView.java实例化注册callback时,主动获取电量并调用onBatteryLevelChanged方法

代码:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java 

@Override
    public void addCallback(BatteryController.BatteryStateChangeCallback cb) {
        synchronized (mChangeCallbacks) {
            mChangeCallbacks.add(cb);
        }
        if(cb instanceof BatteryMeterView && !mHasReceivedBattery){
            Intent intent = mContext.registerReceiver(null,
                new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
                if(intent != null){
                    firstSetBatteryUI(intent,cb);
                }
        }
        if (!mHasReceivedBattery) return;

        // Make sure new callbacks get the correct initial state
        cb.onBatteryLevelChanged(mLevel, mPluggedIn, mCharging);
        cb.onPowerSaveChanged(mPowerSave);
        cb.onBatteryUnknownStateChanged(mStateUnknown);
    }

    public void firstSetBatteryUI(Intent intent,BatteryController.BatteryStateChangeCallback cb){
        int mLevel = (int)(100f
                * intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)
                / intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100));
        boolean mPluggedIn = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0;

        final int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS,
                BatteryManager.BATTERY_STATUS_UNKNOWN);
        boolean mCharged = status == BatteryManager.BATTERY_STATUS_FULL;
                mCharging = mCharged || status == BatteryManager.BATTERY_STATUS_CHARGING;
        boolean mWirelessCharging = mCharging && intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0)
                    == BatteryManager.BATTERY_PLUGGED_WIRELESS;

        boolean present = intent.getBooleanExtra(EXTRA_PRESENT, true);
        boolean unknown = !present;
        cb.onBatteryLevelChanged(mLevel, mPluggedIn, mCharging);
         cb.onPowerSaveChanged(mPowerSave);
         cb.onBatteryUnknownStateChanged(unknown);
    }

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐