Проблемы с трансляцией ACTION_HEADSET_PLUG в Android

Я пробовал эти телефоны: 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) отправляет null для состояния + микрофон, «Нет устройства» в качестве имени, когда гарнитура / наушники отключены, и отправляет null для состояния + микрофон, «Stereo HeadSet» / «Stereo HeadPhones» в качестве имени, когда гарнитура / наушники подключены.

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

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

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

ОБНОВИТЬ:

Код в 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();
    }
}

}


person Denis Masyukov    schedule 26.03.2010    source источник
comment
не могли бы вы опубликовать свой код? Странно, что он запускается при запуске активности и при вращении.   -  person Daniel Benedykt    schedule 26.03.2010
comment
Даниил - смотрите обновление в посте   -  person Denis Masyukov    schedule 26.03.2010


Ответы (3)


Код неверный!

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

    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);

Оно работает!

person maqiutian    schedule 18.10.2011

Трансляция приходит при запуске активности (не ожидается)

Это в документации registerReceiver:

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

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

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

person Larphoid    schedule 24.09.2013
comment
#Larphoid, вы нашли разрешение для устройств, которые не отправляют намерение HEADSET_PLUG. Мне нужно решить эту проблему: stackoverflow.com/questions/28619583/ - person William; 20.02.2015

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

person Denis Masyukov    schedule 07.04.2010