【问题标题】:ACTION_POWER_CONNECTED not send by IntentACTION_POWER_CONNECTED 不是由 Intent 发送的
【发布时间】:2016-11-24 07:54:04
【问题描述】:

在我的应用程序中,我想检查手机是通过插座还是 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>

充电接收器

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 测试了代码。我认为它在 Lollipop 上有效,但我不完全确定...

【问题讨论】:

    标签: android android-intent broadcastreceiver


    【解决方案1】:

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

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

    BatteryManager 在一个广播中广播所有电池和充电详细信息 包含充电状态的粘性 Intent。

    所以你可以在onReceive中试试下面的代码sn-p:

    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

    【讨论】:

    • 哇,这很好用,谢谢!我认为这不是最好的解决方案,因为我对 BroadcastBroadcast 做出反应,但由于我无法通过清单注册此 Intent,这是迄今为止我可以使用的唯一解决方案,或者你有任何美化这个的想法?还是我对这个有点小气?
    • 我认为在您的广播接收器中执行此操作将是一个很好的解决方案,因为您只想在电源连接状态发生变化的情况下接收电池状态信息
    【解决方案2】:

    @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;
    

    (这些 sn-ps 不是我的,而是来自 docs

    请注意,这样做并没有错,正如文档所建议的那样。

    现在,回到您的代码,您实际上正在列出 ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED,它们用于监控充电状态的变化,并且可能有助于处理您的电池电量可以用。

    【讨论】:

      【解决方案3】:

      试试这个

              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

      【讨论】:

      • 感谢您的回答,但我很抱歉。这也不起作用
      • 布尔 isCharging 得到什么值?
      • 它也总是返回false
      • 你能告诉我你的状态值吗
      • 它也总是-1。我找到了这个here,所以我认为它总是返回-1 没关系。我只通过清单注册广播接收器。但是EXTRA_PLUGGED 应该可以工作...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多