【问题标题】:Problems with ACTION_POWER_CONNECTEDACTION_POWER_CONNECTED 的问题
【发布时间】:2012-04-18 14:31:37
【问题描述】:

我在我的应用程序中使用以下示例页面中的代码来监控设备何时连接/断开电源适配器:

http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

所以我的清单中有:

    <receiver android:name=".StatusChangeReceiver">
        <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 StatusChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    boolean isActive = prefs.getBoolean("isActive", false);
    if (isActive){
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
        // Do somthing with isCharging here
    }

}

但是 isCharging 总是假的,不管电源是连接还是断开。我显然在调试时遇到了问题,因为我必须保持(断开)连接 USB 电缆才能触发事件。

我认为当连接电源时会触发事件并且在我的代码运行之前状态不会更新,但我不确定解决它的最佳方法。有什么想法吗?

【问题讨论】:

  • 好的,所以使用模拟器和远程登录来打开/关闭电源我注意到我总是得到状态 = -1,因此看起来数据没有传递到意图中。不知道为什么。

标签: android


【解决方案1】:

正如@gnichola 所建议的,引用this post 是正确答案:

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
        }
    }
}

以下是另一种(尽管不正确)方法:

我遇到了与其他人指出的相同的问题。我的解决方案是在ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED 广播接收器中调用ACTION_BATTERY_CHANGED 阻塞意图:

onCreate() 或其他一些适当的初始化器中:

// register our power status receivers
IntentFilter powerConnectedFilter = new IntentFilter(Intent.ACTION_POWER_CONNECTED);
registerReceiver(PowerStatusReceiver, powerConnectedFilter);

IntentFilter powerDisconnectedFilter = new IntentFilter(Intent.ACTION_POWER_DISCONNECTED);
registerReceiver(PowerStatusReceiver, powerDisconnectedFilter);

定义我们的BroadcastReceiver 并在其中嵌入BATTERY_STATUS 请求:

BroadcastReceiver PowerStatusReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        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);
        isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;
    }
};  

此外,使用这种方法,您不必在清单中定义接收器……但这最终完全取决于您的用例需求。

【讨论】:

  • 我发现答案here 是正确的,似乎意图并没有附带文档建议的信息。只需打开意图的操作对我有用。
  • 我同意您链接中建议的方法。我会更新我的答案以引用它。
  • 不知道为什么你在这里包含不正确的方法。我和你做的一样,当发送 CONNECTED/DISCONNECTED 广播时,似乎 ACTION_BATTERY_CHANGED 意图偶尔还没有更新。
【解决方案2】:

您也可以通过BatteryManager.EXTRA_PLUGGED查看

public boolean isChargingmy(Context context)
    {
        IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        Intent batteryStatus = context.getApplicationContext().registerReceiver(null, ifilter);
        boolean bCharging=false;
        if(batteryStatus != null){

            int plugged = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
            Log.e("plugged","plugged:"+plugged);
            bCharging= plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB;
            Log.e("bCharging","bCharging:"+bCharging);
        }
        else{
            Log.e("batteryStatus","batteryStatus:"+null);
        }

        return bCharging;
    }

我已经在BroadcastReceiver 中注册了接收器,所以我使用了 context.getApplicationContext().registerReceiver() 。仅当您未在 BroadcastReceiver 上注册时,您才必须使用 context.registerReceiver()

【讨论】:

    【解决方案3】:

    我也有同样的问题,但是看看intent action使用的是什么intent.getAction(),广播接收到了预期的信息:

    I/POWER: android.intent.action.ACTION_POWER_DISCONNECTED   
    I/POWER: android.intent.action.ACTION_POWER_CONNECTED
    

    因此,就我而言,这就是我在代码中所需要的,因为我知道何时连接/断开电缆。请记住,使用这意味着您只收到这些事件,而不是其他与电池相关的事件,就像使用 ACTION_BATTERY_CHANGED 一样。

    【讨论】:

      【解决方案4】:

      这里也有解释:battery status on ACTION_POWER_CONNECTED

      我遇到了同样的问题,并且打电话或检查电池状态的速度太快了。 ACTION_POWER_CONNECTED 在 ACTION_BATTERY_CHANGED 更新之前被调用,所以也许使用 AlarmManager 来安排自己在几秒钟内再次醒来,然后再次检查。 两秒钟,在我的测试中还不够长……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多