ACTION_POWER_CONNECTED 不是按 Intent 发送

ACTION_POWER_CONNECTED not send by Intent

在我的应用程序中,我想检查 phone 是否通过插座或 USB 充电。为此,我使用以下代码创建了一个 BroadcastReceiver

清单:

<receiver
    android:name=".ChargingReceiver"
    android:enabled="true" android:exported="false">

    <intent-filter>
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
        <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
    </intent-filter>
</receiver>

充电接收器

public void onReceive(Context context, Intent intent) {
    int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);

    boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC);
    boolean usbCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_USB);

    //...
}

我的问题是,ChargingReceiver 的第一行总是 return -1 这是我设置的默认值。当我插入或拔出我的 phone 时,BroadcastReceiver 被正确调用,因此在我看来,意图不包含我尝试查找的 Extra。我有来自 here 的代码,所以它应该可以工作。

我也找到了 答案,但它对我没有帮助,因为我必须区分 USB 充电和插座充电。任何想法我做错了什么?顺便说一句,我已经用 Android Nougat 测试了代码。我认为它在 Lollipop 上有效,但我不完全确定...

试试这个

        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                            status == BatteryManager.BATTERY_STATUS_FULL;

        int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
        boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;

根据@MarkB 的建议,您必须从 Java 代码 refer

中明确注册 ACTION_BATTERY_CHANGED

您在清单中注册了 ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED。但是这些广播不包含有关充电状态的信息。

为了接收有关充电状态的信息,您需要注册 ACTION_BATTERY_CHANGED 广播。来自开发者文档:

The BatteryManager broadcasts all battery and charging details in a sticky Intent that includes the charging status.

因此您可以在 onReceive 中尝试以下代码片段:

Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean pluggedAC = (plugged == BatteryManager.BATTERY_PLUGGED_AC);
boolean pluggedUSB = (plugged == BatteryManager.BATTERY_PLUGGED_USB);

您可以阅读更多相关内容here

@MarkB 方法是正确的,它与开发人员文档中建议的方法相同。我想指出您不需要注册任何 BroadcastReceiver 因为那是 Sticky Intent.

基本上您需要做的就是调用 registerReceiver 传递 null 作为接收者,当然还有操作 (Intent.ACTION_BATTERY_CHANGED):

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);

然后你可以这样做:

// Are we charging / charged?

int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;

// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;

(这些片段不是我的,而是来自文档

请注意,按照文档的建议,这样做没有任何问题。

现在,回到您的代码,您实际上正在监听 ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED,它们用于监控充电状态的变化,并且可以对于处理您可以使用的电池电量很有用。