2016-11-24 14 views
3

在我的应用程序中,我想检查手机是否由套接字或USB充电。为此,我创建了一个BroadcastReceiver用下面的代码:ACTION_POWER_CONNECTED不是由意图发送

清单:

<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的代码。我觉得棒棒糖它已经工作,但我不能完全肯定...

回答

1

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

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

BatteryManager以包含充电状态的粘性Intent广播所有电池和充电详情。

所以,你可以尝试在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

+0

哇这个作品谢谢你!我认为这不是最好的解决方案,因为我对'Broadcast'做出了反应,但由于我无法通过清单注册这个'Intent',所以它是目前唯一可以使用的解决方案,或者您是否有任何美化这个想法?或者我有点小瞧这个? – Cilenco

+0

我认为在您的广播接收器中这样做会是一个很好的解决方案,因为您只想在电源连接状态改变的情况下接收电池状态信息 – IIIIIIIIIIIIIIIIIIIIII

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代码注册ACTION_BATTERY_CHANGED refer

+0

感谢您的回答,但我很抱歉。这也不起作用 – Cilenco

+0

你得到什么值布尔isCharging? – Nas

+0

它也总是返回'false'。 – Cilenco

1

@MarkB做法是正确的,它在开发者文档同一个建议。我想指出,您不需要注册任何BroadcastReceiver,因为这是Sticky Intent

基本上所有你需要做的是调用registerReceiver在空传递作为接收器,当然还有动作(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; 

(这些片段不是我,但是从文档

请注意,这样做没有任何问题,因为文档也显示它。现在

,又回到了代码你实际上listeting为ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED,这是用来监测充电状态的变化,可能是处理电池可以使用量是有用的。