Как перехватить нажатие кнопок на гарнитуре в Android?
Я изучал ACTION_MEDIA_BUTTON
Намерение, и я пытаюсь использовать это и перехватывать нажатия кнопок и представлять их на экране, используя тост. Я зарегистрировал получателя для перехвата двух намерений:
ACTION_HEADSET_PLUG
- подключить гарнитуру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 ответа
Недавно я разработал приложение, которое реагирует на кнопку мультимедиа. Я тестировал его в 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
выше). Тем не менее, он попробовал несколько других методов, и ни один из них, казалось, не работал. Так что я должен прибегнуть к этому... Я надеюсь, что помог.
Спасибо за помощь.
Для всех остальных, борющихся здесь, заключительные выводы:
После многих кровавых слез мне, наконец, удалось понять, что есть два типа трансляций, которые я могу перехватить: некоторые как ACTION_HEADSET_PLUG
должны быть зарегистрированы в коде деятельности.
Другим нравится ACTION_MEDIA_BUTTON
должны быть зарегистрированы в файле манифеста.
В этом примере, чтобы перехватить оба намерения, мы требуем сделать оба.
Установите его в коде и в файле манифеста.
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");
}
Этот код возвращает тост "Кнопка нуль была нажата"