7

我的意图是在首选项中保存 Android 设备 USB/电源线的当前状态:已连接/已断开连接。从开发人员网站我看到有两个意图获得该状态:ACTION_POWER_CONNECTED / DISCONNECTED。因此,我使用了与 Developers 上发布的代码相同的代码:

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

在监控充电状态变化部分。

显现

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

Java 代码

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

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

        Toast.makeText(context, "pvr = " + usbCharge + ", " + acCharge + "," + isCharging, Toast.LENGTH_SHORT).show();
    }
}

当我插入 USB 电缆 IN/OUT 时,广播总是正确发送并被 PowerConnectionReceiver 捕获,但结果始终相同(=电缆已拔出)。

我用 Galaxy Nexus 4.1.1 / 4.2.1 对其进行了测试 - 我总是在 Toast 中得到 2xFALSE(chargePlug = FALSE,usbCharge = FALSE)。

为什么intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1)总是返回默认值“-1”?

谢谢你。

附言。如果我在 Java 中注册接收器,一切正常

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

...在服务或活动中。但是根据 Android Developers 网站,不需要使上面的代码返回正确的值;

4

3 回答 3

8

我正在处理同样的问题,遇到你的帖子。我认为问题在于您提供链接的 Android 培训页面中的代码是错误的。

ACTION_POWER_CONNECTED 和 ACTION_POWER_DISCONNECTED 没有“携带”您从代码中的意图查询的数据。我也无法在我的设备上使用相同的东西(运行 Android 4.3 的第一代 Nexus 7 和运行 Android 2.3.6 的 Nexus One),而且因为它似乎无法在任何地方工作,所以我遇到了“错误代码”结论。

我用下面的代码修复了它。它实际上非常接近您作为修复提供的内容,只是它直接进入我的 BroadcastReceiver 而不是进入活动。在您上面的代码中,此处的代码段将位于以“int chargePlug”开头的行之前。之后,将同一行(您的行)中的“intent”从“int chargePlug”开始更改为“mIntent”。

final Intent mIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

请注意,您的 BroadcastReceiver 现在将有两个意图。一个传递给它,这将是包含动作 ACTION_POWER_CONNECTED(或 ACTION_POWER_DISCONNECTED)的意图,另一个是在 BroadcastReceiver 中创建的,专门用于提取电池信息。

如果您将我提供的代码片段放入活动中(它不会连接到您的广播接收器),我提供的代码片段将不起作用,因为参数列表中的值为空。您实际上并没有使用该 null 注册 BroadcastReceiver 。将 null 更改为 BroadcastReceiver 也不理想,因为 ACTION_BATTERY_CHANGED 通知可以触发很多。我很有信心 ACTION_BATTERY_CHANGED 不打算用作广播接收器的触发器。相反,我认为它旨在实时用于获取最后一个“粘性”广播,其中包含有关电池信息更改的信息(在 Android 文档中查找“粘性广播”)。

另请注意,我给出的代码片段在调用链中包含“getApplicationContext()”。把它拿出来,Gingerbread 设备就会崩溃(感谢 CommonsWare)。

于 2013-09-22T23:42:18.877 回答
2

我不确定您为什么会遇到问题,但对我有用的是注册 ACTION_POWER_CONNECTED 和 ACTION_POWER_DISCONNECTED 操作:

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

并像这样实现广播接收器:

public class PowerReceiver extends BroadcastReceiver {

    @Override public void onReceive(Context context, Intent intent) {
        if(intent.getAction() == Intent.ACTION_POWER_CONNECTED) {
            //Handle power connected
        } else if(intent.getAction() == Intent.ACTION_POWER_DISCONNECTED){
            //Handle power disconnected
        }
    }
}
于 2013-12-05T06:07:23.020 回答
1
public class PowerConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        final Intent mIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

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


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

    }
}
于 2016-11-16T08:40:01.753 回答