6

我目前正在尝试一种可靠的方法来确定特定的充电器类型,在我的情况下是这样的音乐底座。问题是这个坞站不幸在停靠时没有发送停靠事件。

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

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

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

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

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

4

4 回答 4

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 extra 中提取当前的对接状态:

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

更改广播的名称和您的接收器。

于 2013-11-21T07:57:04.397 回答
0

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

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

于 2013-11-27T08:46:06.503 回答
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.

电池管理器

于 2013-11-27T13:10:32.933 回答
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;
于 2014-03-01T16:10:52.490 回答