2010-11-03 12 views
10

Próbuję wstrzymać odtwarzanie muzyki, gdy zestaw słuchawkowy jest odłączony.Plik Intent.ACTION_HEADSET_PLUG jest odbierany, gdy aktywność się rozpoczyna

Utworzyłem program BroadcastReceiver, który nasłuchuje na intencje ACTION_HEADSET_PLUG i działa na nich, gdy stan extra wynosi 0 (dla odłączonego). Mój problem polega na tym, że intencja ACTION_HEADSET_PLUG jest odbierana przez mój program BroadcastReceiver za każdym razem, gdy aktywność jest uruchamiana. Nie takiego zachowania się spodziewam. Spodziewam się, że cel zostanie uruchomiony tylko wtedy, gdy zestaw słuchawkowy jest podłączony lub odłączony.

Czy istnieje przyczyna, że ​​intencja ACTION_HEADSET_PLUG została złapana natychmiast po zarejestrowaniu odbiornika z tym filtrem IntentFilter? Czy istnieje wyraźny sposób, w jaki mogę pracować z tym problemem?

Zakładam, że ponieważ domyślny odtwarzacz muzyki realizuje podobne funkcje, gdy zestaw słuchawkowy jest odłączony, jest to możliwe.

Czego mi brakuje?

Jest to kod rejestracyjny

registerReceiver(new HeadsetConnectionReceiver(), 
       new IntentFilter(Intent.ACTION_HEADSET_PLUG)); 

To jest definicja HeadsetConnectionReceiver

public class HeadsetConnectionReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
     Log.w(TAG, "ACTION_HEADSET_PLUG Intent received"); 
    } 

} 

Odpowiedz

15

Dzięki za odpowiedź Jake. Powinienem zaktualizować pierwotny wpis, aby wskazać, że odkryłem problem, który miałem. Po kilku badaniach odkryłem, że intencja ACTION_HEADSET_PLUG jest transmitowana przy użyciu metody sendStickyBroadcast w kontekście.

Przyklejone intencje są utrzymywane przez system po nadaniu. Ten zamiar zostanie złapany za każdym razem, gdy zostanie zarejestrowany nowy program BroadcastReceiver. Wywoływane jest natychmiast po rejestracji zawierającej ostatnią zaktualizowaną wartość. W przypadku zestawu słuchawkowego przydaje się możliwość ustalenia, czy zestaw słuchawkowy jest już podłączony po pierwszym zarejestrowaniu odbiornika.

Jest to kod, który kiedyś otrzymać Intent ACTION_HEADSET_PLUG:

private boolean headsetConnected = false; 

public void onReceive(Context context, Intent intent) { 
    if (intent.hasExtra("state")){ 
     if (headsetConnected && intent.getIntExtra("state", 0) == 0){ 
      headsetConnected = false; 
      if (isPlaying()){ 
       stopStreaming(); 
      } 
     } else if (!headsetConnected && intent.getIntExtra("state", 0) == 1){ 
      headsetConnected = true; 
     } 
    } 
} 
+0

Alternatywnym rozwiązaniem byłoby użycie metody removeStickyBroadcast() w przypadkach, gdy nie można po prostu zignorować poleceń, gdy usługa jest Play. – greg7gkb

+16

Myślę, że jeszcze lepszym rozwiązaniem jest użycie [isInitialStickyBroadcast()] (http://developer.android.com/reference/android/content/BroadcastReceiver.html#isInitialStickyBroadcast%28%29) w twoim odbiorniku. Nie wymaga to zdefiniowania uprawnień do usuwania programów lepkich i nie spowoduje efektów ubocznych w innych aplikacjach. – amram99

+0

Hej znowu Doug. Być może źle zrozumiałem coś o tym systemie odbiorczym, który ma android. Ale w jaki sposób masz dostęp do gry isPlaying, czy rozpoznałbym ich w pierwotnej aktywności? :-) –

-2

wpadłem na ten sam problem. Nie jestem pewien, co powoduje to, ale przynajmniej w moich testach wydaje się być spójny, co oznacza, że ​​można obejść go. Zrobiłem to, dodając zmienną składową logiczną, która zaczyna się jako prawda, i jest ustawiona na wartość false w pierwszym wywołaniu onReceive(Context, Intent). Flaga ta kontroluje wtedy, czy faktycznie przetwarzam zdarzenie unplug, czy nie.

Dla Twojego odniesienia, oto kod, którego używam, aby to zrobić, który jest dostępny w kontekście here.

private boolean isFirst; 

public void onReceive(Context context, Intent intent) 
{ 
    if(!isFirst) 
    { 
     // Do stuff... 
    } 
    else 
    { 
     Log.d("Hearing Saver", "First run receieved."); 
     isFirst = false; 
    } 
} 
+1

lepsze wykorzystanie isInitialStickyBroadcast() jako sugerowane w innym komentarzu. –

0

używam innego podejścia, aby zatrzymać odtwarzanie, gdy zestaw słuchawkowy jest odłączyć. Nie chcę, żebyś go używał, ponieważ już wszystko w porządku, ale inne osoby mogą uznać to za użyteczne. Jeśli masz kontrolę ostrości audio, a następnie Android wyśle ​​audio zdarzeń staje się głośny, więc jeśli piszesz odbiornik do tego wydarzenia będzie wyglądać

public void onReceive(Context context, Intent intent) { 
if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) { 
     if (isPlaying()){ 
      stopStreaming(); 
     } 
    } 
} 
Powiązane problemy