mtk Android从上之下获取电池电量信息

今天讲讲mtk Android平台如何获取电池相关信息。

获取电池信息最常用的方法-注册广播(被动接受)

IntentFilter filter2 = new IntentFilter();

filter2.addAction(Intent.ACTION_BATTERY_CHANGED);registerReceiver(filter2,receiver);

接收到广播后,用getIntExtra("level")和getIntExtra("scale")获得相应值

intent.getIntExtra("level", 0);    ///电池剩余电量

intent.getIntExtra("scale", 0);  ///获取电池满电量数值

intent.getStringExtra("technology");  ///获取电池技术支持

intent.getIntExtra("status",BatteryManager.BATTERY_STATUS_UNKNOWN); ///获取电池状态

intent.getIntExtra("plugged", 0);  ///获取电源信息

intent.getIntExtra("health",BatteryManager.BATTERY_HEALTH_UNKNOWN);  ///获取电池健康度

intent.getIntExtra("voltage", 0);  ///获取电池电压

intent.getIntExtra("temperature", 0);  ///获取电池温度

 如果是调试,也可以adb 查看

C:\Users\ShawnXia>adb shell dumpsys battery
Current Battery Service state:
  AC powered: false ///有线充电器状态
  USB powered: true ///USB连接状态
  Wireless powered: false ///无线充电状态
  Max charging current: 500000 ///最大充电电流,单位微安(uA)
  Max charging voltage: 5000000 ///最大充电电压,单位微伏(uV)
  Charge counter: 4149000 ///
  status: 2 ///充电状态,UNKNOWN=1,CHARGING=2,DISCHARGING=3,NOT_CHARGING=4,FULL=5
  health: 2 ///电池健康状态
  present: true ///
  level: 95 ///当前95%
  scale: 100 ///满电100%
  voltage: 4244 ///电压
  temperature: 250 ///温度
  technology: Li-ion

那电池广播 Intent.ACTION_BATTERY_CHANGED是从哪里发来的呢。

从BatteryService.java的sendIntentLocked里面发的

 //  Pack up the values and broadcast them to everyone
        final Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
                | Intent.FLAG_RECEIVER_REPLACE_PENDING);

....

    mHandler.post(new Runnable() {
            @Override
            public void run() {
                ActivityManagerNative.broadcastStickyIntent(intent, null, UserHandle.USER_ALL);这里发出的。
            }
        });

 

那这个广播又是什么时候发的呢。

我们继续找sendIntentLocked。

流程是这样的onStart()-BatteryListener()-update()-processValuesLocked()-sendIntentLocked()。

在onStart注册监听器。当电池信息有变化时,发送ACTION_BATTERY_CHANGED出去。

那BatteryListener监听的是什么呢。我们继续看。

这里是注册地方。

void BatteryPropertiesRegistrar::registerListener(const sp<IBatteryPropertiesListener>& listener) {
    {
        if (listener == NULL)
            return;
        Mutex::Autolock _l(mRegistrationLock);
        // check whether this is a duplicate
        for (size_t i = 0; i < mListeners.size(); i++) {
            if (IInterface::asBinder(mListeners[i]) == IInterface::asBinder(listener)) {
                return;
            }
        }

        mListeners.add(listener);
        IInterface::asBinder(listener)->linkToDeath(this);
    }
    healthd_battery_update();-
}

void healthd_battery_update(void) {
    // Fast wake interval when on charger (watch for overheat);
    // slow wake interval when on battery (watch for drained battery).

   int new_wake_interval = gBatteryMonitor->update() --最终走这里
       healthd_config.periodic_chores_interval_fast :
           healthd_config.periodic_chores_interval_slow;

    if (new_wake_interval != wakealarm_wake_interval)
            wakealarm_set_interval(new_wake_interval);

    // During awake periods poll at fast rate.  If wake alarm is set at fast
    // rate then just use the alarm; if wake alarm is set at slow rate then
    // poll at fast rate while awake and let alarm wake up at slow rate when
    // asleep.

    if (healthd_config.periodic_chores_interval_fast == -1)
        awake_poll_interval = -1;
    else
        awake_poll_interval =
            new_wake_interval == healthd_config.periodic_chores_interval_fast ?
                -1 : healthd_config.periodic_chores_interval_fast * 1000;
}
 

 int new_wake_interval = gBatteryMonitor->update() 最终走的是这里。

这个代码在BatteryMonitor.cpp下面

bool BatteryMonitor::update(void) {}

太长了,就不贴了。

我们知道,电池信息节点文件是在驱动层面。kernel上报消息,用的是uevent。

static void uevent_event(uint32_t /*epevents*/) {
    char msg[UEVENT_MSG_LEN+2];
    char *cp;
    int n;

    n = uevent_kernel_multicast_recv(uevent_fd, msg, UEVENT_MSG_LEN);
    if (n <= 0)
        return;
    if (n >= UEVENT_MSG_LEN)   /* overflow -- discard */
        return;

    msg[n] = '\0';
    msg[n+1] = '\0';
    cp = msg;

    while (*cp) {
        if (!strcmp(cp, "SUBSYSTEM=" POWER_SUPPLY_SUBSYSTEM)) {
            healthd_battery_update();
            break;
        }

        /* advance to after the next \0 */
        while (*cp++)
            ;
    }
}
 

当系统开启时,系统会走healthd.cpp的main函数。

在这里会监听POWER_SUPPLY_SUBSYSTEM文件发生变化,会执行healthd_battery_update



 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MTK电池电量同步是指在使用MTK芯片的设备上,系统会实时地更新显示电池的剩余电量情况。然而,有时候我们可能会遇到电量同步不准确的情况。 导致MTK电池电量同步问题的原因可能有多种。首先,电池老化可能是一个导致不准确电量显示的原因。随着时间的推移,电池容量会逐渐减小,从而导致电量显示不准确。此外,使用的充电器和数据线的质量也会影响电量同步。如果使用的充电器和数据线质量不好,可能会导致电量显示不准确或者无法正确充电。 其次,操作系统的错误或软件问题也可能导致电量同步不准确。如果设备的操作系统或者某些应用程序存在缺陷,可能会导致电量显示不准确。这时,我们可以尝试更新系统或者卸载一些有问题的应用程序,以解决电量同步问题。 此外,使用电池优化应用程序也可能会影响电池电量同步。有些电池优化应用程序可能会对电池电量进行优化管理,但有时候可能会造成电量同步不准确的情况。因此,我们可以尝试调整或关闭电池优化应用程序,查看是否能够解决电量同步问题。 总结来说,MTK电池电量同步问题可能由电池老化、充电器、数据线质量、操作系统错误、软件问题和电池优化应用程序等多个因素造成。通过检查和调整这些因素,我们可以尝试解决电量同步不准确的问题,以保证设备正常使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值