ACTION_POWER_CONNECTED不是由Intent

时间:2016-11-24 07:54:05

标签: android android-intent broadcastreceiver

在我的应用程序中,我想检查手机是否通过socket或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>

ChargingReceiver

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的第一行始终返回-1,这是我设置的默认值。当我插上或拔掉我的手机时,正确调用BroadcastReceiver,因此它在我看来意图不包含我试图查找的Extra。我有来自here的代码,所以它应该有用。

我也找到this回答,但它对我没有帮助,因为我必须区分USB充电和插座充电。我做错了什么想法?顺便说一句,我用Android Nougat测试了代码。我认为在棒棒糖上它起作用了,但我并不完全确定......

3 个答案:

答案 0 :(得分:1)

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

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

  

BatteryManager广播所有电池和充电细节   包含充电状态的粘性意图。

因此,您可以在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

的更多信息

答案 1 :(得分:1)

@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;

(这些摘要不是我的,但来自 docs

请注意,这样做并没有错,因为文档也提出了这一点。

现在,回到您的代码,您实际上正在侦听ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED,它们用于监控充电状态的变化,可能对处理你可以使用多少电池。

答案 2 :(得分:0)

试试这个

        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