2013-04-12 6 views
5

Mam prostą, ale prawdopodobnie źle zorganizowaną aplikację dla systemu Android. Składa się z dwóch klas java: MainActivity extending Activity i RemoteControlReceiver, który rozszerza BroadcastReceiver.Program BroadcastReceiver dla intencji ACTION_MEDIA_BUTTON wysyła DWUŚ na jeden przycisk Media kliknięcie

Śledzę dyspozycję w dwóch poniższych linków, aby ustawić słuchawkę Mediabutton: http://android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html http://developer.android.com/training/managing-audio/volume-playback.html

Problem jest, że gdy naciskam przycisk multimedialny (odtwarzanie/pauza, następny, poprzedni) na mój pilot bluetooth, metoda onReceive() broadcastReceiver działa dwukrotnie. A dokładniej cały RemoteControlReceiver zostaje zainicjalizowany w obiekcie, uruchamiana jest metoda onReceive() obiektu, obiekt jest złomowany i powtarzany.

Przetestowałem to, umieszczając statyczny int mult = 0; w MainActivity. Zwiększyłem licznik o 1 przy każdym uruchomieniu onReceive. I zwiększa się dwukrotnie na kliknięcie przycisku.

Nie jestem pewien, co powoduje, że uruchamia się dwa razy. Czy sprzęt wysyła podwójny sygnał za kliknięcie, czy system operacyjny wysyła wiele intencji przycisku multimedialnego na sygnał, czy mój odbiornik działa dwa razy w ciągu jednej operacji?

Mój kod MediaButtonReceiver:

public class RemoteControlReceiver extends BroadcastReceiver { 

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



      Intent i = new Intent(); 
      i.setAction("com.MainActivity.Shakey.MEDIA_BUTTON"); 
      i.putExtra("keyType", keyType); 
      context.sendBroadcast(i); 
      Toast.makeText(context, String.valueOf(MainActivity.mult), Toast.LENGTH_SHORT).show(); 
      MainActivity.mult++; 
      abortBroadcast(); 

     } 

    } 
} 

filtr ten odbiornik jest zarejestrowany w manifeście następująco:

<application> 
... 
    <receiver android:name=".RemoteControlReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_BUTTON"/> 
     </intent-filter> 
    </receiver> 
... 
</application> 

Broadcastreceiver dynamicznie przypisywać do obiektu Audiomanager w główną działalność za onResume() . I jest niezarejestrowany w onPause(). Zgodnie z linkiem, jest to pewny sposób na uzyskanie pierwszego priorytetu w intencjach media_button. Wiem, że mogę zignorować każde nawet wywołanie broadcastReceiver przy użyciu zmiennej statycznej. Chciałbym jednak poznać przyczynę tego problemu.

PS Przyciski odtwarzania/pauzy/poprzedniego/następnego działają dobrze dla domyślnego odtwarzacza muzyki z systemem Android.

Odpowiedz

12

Moim zdaniem problem polega na tym, że OnReceive reaguje na naciśnięcie i zwolnienie przycisku bluetooth. Właśnie dlatego Twój kod działa 2 razy. Spróbuj zrobić czegoś takiego:

if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { 
    KeyEvent Xevent = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);  
    if ((KeyEvent.KEYCODE_MEDIA_PLAY == Xevent.getKeyCode()) && (Xevent.getAction() == KeyEvent.ACTION_DOWN)) { //MainActivity.mult++; ... 

Lub u mogą korzystać ACTION_UP pomimo tego, co u chcą zrobić. Nie jestem pewien, ale mam nadzieję, że to pomoże.

+0

* doh * Tak, to było !! Jestem opóźniony>. <;; Dziękuję Ci – user2275463

Powiązane problemy