【问题标题】:Polling ACTION_BATTERY_LOW轮询 ACTION_BATTERY_LOW
【发布时间】:2017-08-14 10:28:35
【问题描述】:

当电池电量不足时,Android 将发送 ACTION_BATTERY_LOW Intent。然后当它再次正常时,它会发送 ACTION_BATTERY_OKAY。

不幸的是,如果我的应用程序启动电池电量不足,那么我不会收到意图;它不粘,所以我无法检测当前是否存在电池警报。 ACTION_BATTERY_CHANGED 粘性的,但它只告诉我当前的电池充电状态,而不是系统是否已宣布低电量警报。

有没有什么方法可以在任何给定的瞬间检测电池是否电量不足?

【问题讨论】:

  • 为什么不在应用程序启动时检查电池?
  • 因为我不知道系统在什么级别宣布低电量警报。
  • 15% 是系统的低电量警告
  • 请注意,15% 可能是 AOSP 所说的,但设备制造商可以更改它。
  • 有没有办法找出它是什么?

标签: android battery


【解决方案1】:

这是一个非常棘手的问题。Android Developer 上的相关代码有错误。

基本上,您可以在此链接上了解如何检测它:

https://developer.android.com/training/monitoring-device-state/battery-monitoring.html

您可以使用方法 OnReceive(Context context, Intent intent){}

通过广播接收器检测它是否正在充电和电池电量不足

但是,这个链接有一个错误,用于监控重大变化。[注意这里,动作名称是android.intent.action.ACTION_BATTERY_LOW]

[1]

但让我们看看 Intent 是如何描述的。

ACTION_BATTERY_LOW

在 API 级别 1 中添加 字符串 ACTION_BATTERY_LOW 广播操作:指示设备上的电池电量不足。此广播对应于“低电量警告”系统对话框。

这是一个受保护的意图,只能由系统发送。

常量值:“android.intent.action.BATTERY_LOW” 您可以在 Android Developers Intent 中找到它。

换句话说,这里发生了错误。它应该是 action.BATTERY_LOW 而不是 action.ACTION_BATTERY_LOW。所以你在 AndroidManifest 中的代码应该是:

<receiver android:name=".receiver.BatteryLevelReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BATTERY_LOW"/>

            <!--instead of android.intent.action.ACTION_BATTERY_LOW-->
        </intent-filter>
    </receiver>

还要确保您的接收器是正确的。

public class BatteryLevelReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "BAttery's dying!!", Toast.LENGTH_LONG).show();
        Log.e("", "BATTERY LOW!!");

}

}

很难在笔记本电脑上调试或登录,使用 Toast 可能会有所帮助。

        Toast.makeText(context, "BAttery's dying!!", Toast.LENGTH_LONG).show();
        //Toast.makeText(Context context, String str, Integer integer).show();

希望它能帮助你解决问题。

【讨论】:

  • 这仅适用于应用程序在发送意图时正在运行的情况。如果它在宣布低电量警报时启动,我不会收到意图。
  • 对不起......我有点困惑。但是你需要启动你的应用来获取意图,因为它是在你项目的 AndroidManifest 中注册的。
【解决方案2】:

通常在 15% 时会出现低电量警告,因此您可以检查电池电量是否等于或低于 15%。

【讨论】:

  • ...当然,除非制造商更改它。如果必须,我会这样做,但我希望我不必必须这样做。不过,谢谢。
  • 也许您可以阅读低级定义。检查android源代码:grepcode.com/file/repository.grepcode.com/java/ext/…具体是mLowBatteryWarningLevel = mContext.getResources().getInteger(128 com.android.internal.R.integer.config_lowBatteryWarningLevel);
  • 不幸的是,这是私人的,所以我无权访问com.android.internal。但是常量的值是明确定义的,所以我可以很巧妙地以这种方式提取它。不过,这很邪恶。另外,从源代码(感谢链接,顺便说一句),低电量警报并不完全对应于电池电量严格低于 15%。
【解决方案3】:

粘性意图仍然包含一些信息。 您应该仍然可以获取电池电量

int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level / (float)scale;

取自http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

【讨论】:

  • 是的,但这不是我问的。我不想知道电池电量是多少,我想知道系统是否已宣布低电量警报。那不是一回事。
  • boolean isLowBattery(float batteryPct) { return batteryPct
  • @FrankSposaro 我想你误解了他的问题。 15 是一个硬编码的数字。
  • @LaiVung 你在说什么? 15是他想要的数字,但还是没关系,因为它可以改成任何数字。
  • @FrankSposaro 我希望框架中有一个方法或静态字段...我同意可以更改值,但我会避免硬编码。
猜你喜欢
  • 1970-01-01
  • 2013-08-08
  • 2019-05-28
  • 2014-12-26
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
相关资源
最近更新 更多