在我的应用程序中,我想检查手机是否通过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测试了代码。我认为在棒棒糖上它起作用了,但我并不完全确定......
答案 0 :(得分:1)
您在清单中注册了ACTION_POWER_CONNECTED
和ACTION_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_CONNECTED
和ACTION_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