Определить конкретный вход зарядного устройства

В настоящее время я пытаюсь найти надежный способ определения конкретного типа зарядного устройства, в моем случае это музыкальная док-станция, такая как это. Проблема в том, что эта док-станция, к сожалению, не отправляет событие док-станции при стыковке.

Поскольку я делаю приложение, полагаясь на возможность определить, когда устройство было пристыковано или отстыковано. Поэтому мне нужен способ отфильтровать и разделить эти события:

  • Устройство заряжается через разъем USB (без отдельного зарядного устройства)
  • Устройство не подключено к компьютеру
  • Какой-то способ отделить док-станцию ​​для медленной зарядки от стандартного зарядного устройства

Я заметил, что мое устройство (LG optimus 4x HD) по-разному реагирует на каждое из этих действий. Когда он подключен к стандартному зарядному устройству, он не выдает уведомления, когда он подключен к компьютеру, он сообщает мне, что режим USB активирован, а когда он подключен к док-станции, он выдает предупреждение о медленном заряде.

Мне нужно сделать систему с такой же способностью разделять эти действия и реагировать на них. До сих пор я сделал только простой BroadcastReceiver, который реагирует, если устройство подключено или не подключено к зарядному устройству. Мне также удалось отслеживать состояние зарядки с помощью кода, найденного в документация.

Есть ли способ определить этот конкретный вход зарядного устройства?


person Magakahn    schedule 08.11.2013    source источник
comment
Предупреждение о медленной зарядке не имеет ничего общего с док-станцией или нет. есть также зарядные устройства с медленной зарядкой, которые используют настенную розетку. Не было бы никакого способа обнаружить этот конкретный док. Этот док работает неправильно   -  person Ivo Beckers    schedule 27.11.2013


Ответы (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

Измените название трансляции и вашего ресивера.

person Jatin Malwal    schedule 21.11.2013
comment
Это я уже знаю, но проблема в том, что этот док не отправляет событие дока. В любом случае спасибо! - person Magakahn; 21.11.2013
comment
Вы можете проверить свой код, отправив внешнюю трансляцию через adb. Возможно, вы не принимаете трансляцию на определенном устройстве. - person Jatin Malwal; 22.11.2013
comment
оболочка adb в эфире -a android.intent.action.POWER_CONNECTED -n com.jm.monitoringbatterydemo/.PowerConnectionReceiveradb в оболочке am - person Jatin Malwal; 22.11.2013
comment
Как это решит мою проблему. Моя проблема в том, что я должен сделать BroadcastReceiver, который реагирует только тогда, когда он подключен к этому типу устройства. Он не отправляет DOCK_EVENT любого рода. - person Magakahn; 22.11.2013
comment
Создайте приемник, который реагирует, когда происходит событие док-станции, но не происходит ни одно из упомянутых выше конкретных событий. - person Jatin Malwal; 22.11.2013
comment
Я не хочу, чтобы он реагировал при подключении к компьютеру или зарядному устройству. - person Magakahn; 22.11.2013
comment
Просто поместите туда несколько чеков. Когда он подключен к зарядному устройству или компьютеру, также есть некоторые уведомления. Поэтому, когда вы найдете что-то идентичное, не реагируйте на это, иначе сделайте то, что хотите сделать в приемнике, - person Jatin Malwal; 23.11.2013
comment
В этом суть проблемы. Я не могу найти один или несколько чеков/ресиверов, которые реагируют только тогда, когда они подключены к этой док-станции. - person Magakahn; 23.11.2013
comment
Что делать, если это конкретная проблема вашей подержанной док-станции? Моя док-станция действительно транслирует DOCK_EVENT на моем GalaxyNexus - person Rafael T; 27.11.2013
comment
Это точно такой же док или просто похожий? - person Magakahn; 27.11.2013
comment
Я также предлагаю вам попробовать другую док-станцию ​​​​с другим устройством. или посмотреть мою правку... - person Jatin Malwal; 30.11.2013

Что вы можете сделать, чтобы решить эту проблему, так это посмотреть, сколько процентов заряда батареи осталось на вашем телефоне. Затем вы можете определить, что значение растет, что означает, что оно закреплено. Единственная проблема с этим может заключаться в том, что если вы иногда заряжаете его на обычном зарядном устройстве, а не на док-станции, он все равно будет реагировать, как если бы он был одним из них.

Дополнительная информация об уровне заряда батареи и т. д.: http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

person Voidpaw    schedule 27.11.2013
comment
Я не могу найти способ, чтобы он реагировал только при подключении к док-станции и не подключен к зарядному устройству. В любом случае спасибо. - person Magakahn; 27.11.2013

Было бы полезно определить источник питания с помощью

  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?

person kirsche40    schedule 27.11.2013
comment
Не очень, еще бы делать усложнения со штатным зарядником. - person Magakahn; 27.11.2013

Надеюсь, этот код поможет:

    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;
person user3368570    schedule 01.03.2014
comment
Вместо того, чтобы просто предоставлять код, может помочь некоторое объяснение того, что вы делаете или пытаетесь достичь. - person Robin van der Knaap; 01.03.2014