Проблемы с трансляцией ACTION_HEADSET_PLUG в Android - PullRequest
1 голос
/ 26 марта 2010

Я пробовал эти телефоны: Motorolla Backflip 1.5, Nexus One 2.1

По сути, я регистрирую BroadcastReceiver, чтобы получать трансляцию ACTION_HEADSET_PLUG, и просматриваю 3 дополнения, которые намереваются:

  • состояние
  • имя
  • Микрофон

Вот описание из API:

* state - 0 for unplugged, 1 for plugged.
* name - Headset type, human readable string
* microphone - 1 if headset has a microphone, 0 otherwise

Проблема № 1: широковещательная рассылка происходит, когда начинается действие (не ожидается), когда происходит поворот экрана (не ожидается) и когда гарнитура / наушники подключены / отключены (ожидается).

Проблема №2: телефон Backflip (1.5) отправляет ноль для состояния + микрофон, «Нет устройства» в качестве имени, когда гарнитура / наушники отключены, и отправляет ноль для состояния + микрофон, «Stereo HeadSet» / «Stereo HeadPhones» в качестве имени когда гарнитура / наушники подключены.

ОБНОВЛЕНИЕ: T-Mobile G1 с 1.6 ведет себя так же, как телефон Backflip.

Nexus еще хуже, он всегда отправляет ноль для состояния + микрофон, «Гарнитура» в качестве имени, когда гарнитура / наушники подключены или отключены.

Вопрос: Как можно объяснить, что API так сильно сломан как на версиях 1.5 и 2.1, так и на разных устройствах производителей?

UPDATE:

Код в onCreate основной деятельности:

// Register receiver
    this.registerReceiver(new BroadcastsHandler(), new IntentFilter(Intent.ACTION_HEADSET_PLUG));

Теперь код BroadcastReceiver:

public class BroadcastsHandler extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equalsIgnoreCase(Intent.ACTION_HEADSET_PLUG)) {
        String data = intent.getDataString();
        Bundle extraData = intent.getExtras();

        String st = intent.getStringExtra("state");
        String nm = intent.getStringExtra("name");
        String mic = intent.getStringExtra("microphone");
        String all = String.format("st=%s, nm=%s, mic=%s", st, nm, mic);


        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("Headset broadcast");
        builder.setMessage(all);
        builder.setPositiveButton("Okey-dokey", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builder.create().show();
    }
}

}

Ответы [ 3 ]

3 голосов
/ 18 октября 2011

Код неправильный!

«состояние» и «микрофон» - целое число, а не строка Поэтому код должен быть изменен следующим образом:

    int st = intent.getIntExtra("state" , -1);
    String nm = intent.getStringExtra("name");
    int mic = intent.getIntExtra("microphone", -1);
    String all = "st="+Integer.toString(st)+" nm="+nm+" mic="+Integer.toString(mic);

Работает!

1 голос
/ 24 сентября 2013

Широковещательная рассылка происходит, когда начинается действие (не ожидается)

Это есть в документации реестраReceiver:

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

Я полагаю, что причина в том, что ваша активность имеет шанс получить текущее состояние для таких "липких" трансляций сразу после того, как вы зарегистрировались для этого.

В настоящее время я работаю над приложением с двумя устройствами, которые должны получать ACTION_HEADSET_PLUG, и, похоже, есть устройства, которые не отправляют эту системную трансляцию (я не получаю ее на своем планшете, но получаю ее на своем телефон), поэтому можно сделать вывод, что после регистрации на эту трансляцию, которая не была получена хотя бы один раз, устройство не поддерживает ее отправку. Я не проверял, относится ли это и к другим системным трансляциям, но я бы так и подумал.

0 голосов
/ 07 апреля 2010

Глупо, проблема немного в другом - «штат» и «имя» там без «микрофона». Другое дело - «состояние» - это 0 и 1 для наушников и 0 и 3 для гарнитуры. Супер странно ...

...