Как перехватить нажатие кнопок на гарнитуре в Android? - PullRequest
13 голосов
/ 30 января 2012

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

  1. ACTION_HEADSET_PLUG - подключение гарнитуры

  2. ACTION_MEDIA_BUTTON - получение нажатий кнопок

Это сделано в моей основной деятельности:

        IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
        mediaFilter.setPriority(10000);
        registerReceiver(_receiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG));
        registerReceiver(_receiver, mediaFilter);

Это часть приемника, которая обрабатывает нажатия кнопки:

    if (action.equals(Intent.ACTION_HEADSET_PLUG))
    {
        Toast.makeText(context, "earphones activity",Toast.LENGTH_SHORT).show();
        if (intent.getExtras().getInt("state")==1)//if plugged
            Toast.makeText(context, "earphones plugged",Toast.LENGTH_LONG).show();
        else Toast.makeText(context, "earphones un-plugged",Toast.LENGTH_LONG).show();
    }
    else 
    if (action.equals(Intent.ACTION_MEDIA_BUTTON))
    {
        Toast.makeText(context, "button pressed",Toast.LENGTH_LONG).show();
        key=intent.getExtras().getString("EXTRA_KEY_EVENT");
        Toast.makeText(context, key,Toast.LENGTH_LONG).show();
    }

Сейчасчасть, которая обрабатывает плагин и удаление гарнитуры, работает нормально, но часть, которая перехватывает нажатие кнопки, не работает.

Есть ли причина, по которой код, обрабатывающий ACTION_MEDIA_BUTTON, не работает?

Есть ли у меня специальное разрешение для перехвата такого намерения?

Я использую Samsung Galaxy S2 для проверки кода.

Я посмотрел всепохожие посты и все перепробовал.К сожалению, ничего не работает.

Ответы [ 3 ]

3 голосов
/ 14 февраля 2012

Я недавно разработал приложение, которое реагирует на кнопку мультимедиа.Я тестировал его в Samsung Galaxy S II, и он работал.

Сначала в вашем AndroidManifest.xml, внутри области <application>, поместите следующее:

<!-- Broadcast Receivers -->
<receiver android:name="net.work.box.controller.receivers.RemoteControlReceiver" >
    <intent-filter android:priority="1000000000000000" >
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

Затемсоздайте BroadcastReceiver в другом файле:

public class RemoteControlReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()) {
            KeyEvent event = (KeyEvent) intent .getParcelableExtra(Intent.EXTRA_KEY_EVENT);

            if (event == null) {
                return;
            }

            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                context.sendBroadcast(new Intent(Intents.ACTION_PLAYER_PAUSE));
            }
        }
    }

}

Это, вероятно, , а не лучшее решение (особенно с жестко закодированным android:priority выше).Тем не менее, он попробовал несколько других методов, и ни один из них, казалось, не работал.Поэтому я должен прибегнуть к этому ... Я надеюсь, что помог.

2 голосов
/ 17 февраля 2012

Спасибо за помощь.

Для всех остальных, кто борется здесь, есть окончательные выводы:

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

Другие, такие как ACTION_MEDIA_BUTTON, должны быть зарегистрированы в файле манифеста.

В этом примере, чтобы перехватить оба намерения, мы требуем сделать оба.

Установите его в коде и в файле манифеста.

0 голосов
/ 14 февраля 2012
if (Intent.ACTION_MEDIA_BUTTON.equals(action)) {
    if (intent.hasExtra(Intent.EXTRA_KEY_EVENT)) {
        String key = intent.getStringExtra(Intent.EXTRA_KEY_EVENT);
        toast("Button "+key+" was pressed");
    } else
        toast("Some button was pressed");
}

Этот код возвращает тост "Нажата ноль кнопок"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...