2012-01-29 12 views
13

Studiowałem intencję ACTION_MEDIA_BUTTON i próbuję jej użyć i przechwycić naciśnięcia przycisków i przedstawić je na ekranie za pomocą tostów. Zarejestrowałem odbiornik do przechwytywania dwie intencje:Jak przechwycić naciśnięcia przycisków w zestawie słuchawkowym w systemie Android?

  1. ACTION_HEADSET_PLUG - podłączając słuchawki

  2. ACTION_MEDIA_BUTTON - odbieranie przycisku pras

Odbywa się to w moim Główna działalność:

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

To jest część r eceiver który obsługuje przycisk pras:

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

Teraz część, która obsługuje zestawu plug-in i usuwanie działa dobrze, ale część, która przechwyci naciśnij przycisk nie jest.

Czy istnieje jakiś powód, dla którego kod, który obsługuje ACTION_MEDIA_BUTTON, nie działa?

Czy istnieje specjalne pozwolenie na przechwycenie takiego zamiaru?

Używam Samsung Galaxy S2 do przetestowania kodu.

Przyjrzałem się wszystkim podobnym postom i wypróbowałem wszystko. Niestety nic nie działa.

+0

na jakim urządzeniu to testujesz? – slayton

+0

Samsung galaxy s 2 –

+0

Nie jestem pewien, ale może to być, że TouchWiz nie poprawnie realizuje intencję ANDROID_MEDIA_BUTTON ... – slayton

Odpowiedz

3

Niedawno stworzył aplikację, która odpowiedziała na przycisku multimedialnego. Testowałem to w Samsung Galaxy S II i działało.

Po pierwsze, w swojej AndroidManifest.xml wewnątrz obszaru <application> umieścić następujące:

<!-- 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> 

Następnie utwórz BroadcastReceiver w innym pliku:

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

} 

Jest to prawdopodobnie nie najlepsze rozwiązanie tam (szczególnie twardy kod android:priority powyżej). Wypróbował jednak kilka innych technik i żaden z nich nie działał. Muszę uciec się do tego ... Mam nadzieję, że pomogłem.

+2

Proszę sprawdzić pod poniższym linkiem. Krótki i łatwy. http://android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html – Milton

+1

To działało dla mnie! – Prachi

+0

PS: 1000 musi być wyższą wartością priorytetu, powinieneś otrzymać ostrzeżenie lub błąd wskazujący, że jeśli używasz Androida: priority = "1000000000000000". Właściwie: leoneboaventura

0
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"); 
} 

Ten kod powrotu Toast „przycisk został naciśnięty zerowa”

+0

Proszę wstawić komentarz zamiast udzielać odpowiedzi, jeśli napotkasz problemy. – Mercurial

2

Dzięki za przyczynienie się.

Dla wszyscy inni walczą oto wnioski końcowe:

Po wielu łez krwi udało mi się zrozumieć, że istnieją dwa rodzaje audycji mogę przechwytują: niektórzy lubią ACTION_HEADSET_PLUG są wymagane do rejestracji w kod działań.

Inne, takie jak ACTION_MEDIA_BUTTON, muszą być zarejestrowane w pliku manifestu.

W tym przykładzie przechwytywanie obu intencji wymagamy wykonania obu.

Ustaw go w kodzie i pliku manifestu.

+0

po kilku dniach zmagań: bardzo dziękuję !! – elgui

Powiązane problemy