Android 动作\u电源\u已连接并非有意发送
在我的应用程序中,我想检查手机是通过插座还是usb充电。为此,我使用以下代码创建了一个Android 动作\u电源\u已连接并非有意发送,android,android-intent,broadcastreceiver,Android,Android Intent,Broadcastreceiver,在我的应用程序中,我想检查手机是通过插座还是usb充电。为此,我使用以下代码创建了一个BroadcastReceiver: 清单: <receiver android:name=".ChargingReceiver" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="android.intent.act
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
的第一行总是返回-1
,这是我设置的默认值。当我插上或拔下手机时,广播接收器被正确调用,因此在我看来,该意图并不包含我试图查找的额外
。我有来自的代码,所以它应该可以工作
我也找到了答案,但这对我并没有帮助,因为我必须区分USB充电和插座充电。你知道我做错了什么吗?顺便说一句,我已经用Android牛轧糖测试了代码。我认为棒棒糖是有效的,但我不完全确定…试试这个
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代码更改的操作电池,您注册了
操作电源连接的和操作电源断开的。但这些广播不包括充电状态的信息
为了接收有关充电状态的信息,您需要注册动作\u电池\u更改
广播。从开发者文档:
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);
您可以阅读更多有关此方法的信息。@MarkB方法是正确的,它与开发人员文档中建议的方法相同。我想指出,您不需要注册任何广播接收器
,因为这是一个
基本上,您需要做的就是调用registerReceiver
传入null作为接收方,当然还有操作(Intent.action\u BATTERY\u CHANGED
):
然后你可以这样做:
// 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;
(这些片段不是我的,而是来自文档的)
请注意,按照文档的建议,这样做没有什么错
现在,回到你的代码你实际上是在为动作(电源)连接
和动作(电源)断开(电源)连接(电源)
(电源)连接()和动作(电源)断开(()(。这也不起作用。布尔放电的值是多少?它也总是返回false
。您能告诉我您的状态值吗?它也总是-1
。我发现了这个,所以我认为它总是返回-1
是可以的。我只在舱单上登记广播接收者。但是额外的
应该可以用…哇,这个可以用了,谢谢你!我认为这不是最好的解决方案,因为我用Broadcast
对Broadcast
做出反应,但由于我无法通过清单注册此意图,这是目前为止我唯一可以使用的解决方案,或者你有什么想法来美化它吗?或者我有点小气?我认为在广播接收器中这样做是一个很好的解决方案,因为您只希望在电源连接状态发生变化时接收电池状态信息
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;