确定特定的充电器输入

时间:2013-11-08 21:10:25

标签: android broadcastreceiver battery

我目前正在尝试以可靠的方式确定特定的充电器类型,就我的情况而言,像this这样的音乐基座。问题是,这个停靠站在停靠时不会发送停靠事件。

因为我正在制作一个应用程序,因为它可以确定设备何时停靠或取消停靠。因此,我需要一种过滤和分离这些事件的方法:

  • 设备通过USB连接器充电(没有单独的充电器)
  • 设备连接到计算机
  • 将慢充电底座与标准充电器分开的某种方式

我注意到我的设备(LG optimus 4x HD)设法对这些操作中的每一个做出不同的反应。当它连接到标准充电器时,它不会发出任何通知消息,当它连接到计算机时它告诉我USB模式已被激活,当它连接到底座时,它会给我一个缓慢的充电器警告。

我需要建立一个具有相同能力的系统来分离这些动作并对它们作出反应。到目前为止,我只制作了一个简单的 BroadcastReceiver ,如果设备连接或未连接到充电器,它会做出反应。我还设法使用documentation中的代码监控充电状态。

有没有办法确定这个特定的充电器输入?

4 个答案:

答案 0 :(得分:4)

每当设备停靠或取消停靠时,都会广播ACTION_DOCK_EVENT操作。要监控设备停靠状态的变化,只需在应用程序清单中注册广播接收器,如下面的代码段所示:

<action android:name="android.intent.action.ACTION_DOCK_EVENT"/>

如果设备已停靠,则可将其停靠在四种不同类型的基座中的任何一种:

  • 汽车
  • 低端(模拟)服务台
  • 高端(数字)服务台

停靠状态详细信息作为额外信息包含在ACTION_DOCK_EVENT操作的粘性广播中。因为它很粘,所以您不需要注册BroadcastReceiver。您可以简单地调用registerReceiver()作为广播接收器传入null,如下一个片段所示。

IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT);
Intent dockStatus = context.registerReceiver(null, ifilter);

您可以从额外的EXTRA_DOCK_STATE提取当前停靠状态:

int dockState = battery.getIntExtra(EXTRA_DOCK_STATE, -1);
boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;

您可以通过

找到停靠状态
boolean isCar = dockState == EXTRA_DOCK_STATE_CAR;
boolean isDesk = dockState == EXTRA_DOCK_STATE_DESK || 
                 dockState == EXTRA_DOCK_STATE_LE_DESK ||
                 dockState == EXTRA_DOCK_STATE_HE_DESK;

编辑:

如果您的应用仍然没有收到广播,请尝试使用此代码发送手动广播并检查代码:

adb shell am broadcast -a android.intent.action.POWER_CONNECTED -n com.jm.monitoringbatterydemo/.PowerConnectionReceiver

更改广播和接收方的名称。

答案 1 :(得分:0)

解决此问题的方法是查看手机剩余电量的百分比。然后,您可以确定该值正在上升,这意味着它已停靠。唯一的问题可能是,如果你有时用普通的充电器而不是码头充电,你仍然会让它像一个充电器一样响应。

有关阅读电池电量等的更多信息:http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

答案 2 :(得分:0)

使用

识别电源是否有用
  int   BATTERY_PLUGGED_AC          Power source is an AC charger.
  int   BATTERY_PLUGGED_USB         Power source is a USB port.
  int   BATTERY_PLUGGED_WIRELESS    Power source is wireless.

来自BatteryManager

答案 3 :(得分:0)

希望此代码有所帮助:

    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Intent batteryStatus = mContext.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 == 2;
    boolean acCharge = chargePlug == 1;

    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

    float batteryPct = level / (float)scale;