4

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

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

有没有办法在任何给定的时刻检测电池是否电量不足?

4

3 回答 3

2

这是一个非常棘手的问题。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();

希望它有助于解决您的问题。

于 2016-07-06T22:12:51.243 回答
1

粘性意图仍然包含一些信息。您仍然应该能够获得电池电量

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

于 2012-06-19T15:38:25.577 回答
1

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

于 2012-06-19T15:32:55.750 回答