使用EXTRA_PLUGGED获取USB电缆插入IN / OUT事件不起作用

时间:2013-01-08 15:00:07

标签: android android-intent usb broadcastreceiver battery

我的目的是保存在首选项Android设备USB /电源线的当前状态:已连接/已断开连接。从开发人员站点我看到有两个Intent用于获取该状态:ACTION_POWER_CONNECTED / DISCONNECTED。所以我使用了与开发人员发布的代码相同的代码:

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”?

谢谢。

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

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

...在服务或活动中。但根据Android开发者网站的说法,上面的代码返回正确值并不是先决条件;

3 个答案:

答案 0 :(得分: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通知可以触发A LOT,因此将null更改为BroadcastReceiver也不理想。我非常有信心ACTION_BATTERY_CHANGED并不打算用作BroadcastReceiver的触发器。相反,我认为这是为了实时使用以获得有关电池信息更改的信息的最后“粘性”广播(在Android文档中查找“粘性广播”)。

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

答案 1 :(得分: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
        }
    }
}

答案 2 :(得分: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;

    }
}