2012-06-30 15 views
5

Tytuł sprawia, że ​​brzmienie jest znacznie prostsze niż jest to ... Próbuję nadać intencję, która zatrzyma większość odtwarzaczy muzycznych.Niezawodnie wstrzymywanie odtwarzania multimediów System w Androidzie

wiem, że mogę używać do tworzenia keyEvent że będzie nadawać KEYCODE_MEDIA_PLAY_PAUSE z tym:

long eventTime = SystemClock.uptimeMillis(); 
    Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null); 
    KeyEvent downEvent = new KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0); 
    downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent); 
    ctx.sendOrderedBroadcast(downIntent, null); 

I to działa. Spowoduje to zatrzymanie zapasowego odtwarzacza multimediów w taki sposób, w jaki ja go chcę, a także większość innych odtwarzaczy muzycznych obsługujących przyciski odtwarzania/wstrzymywania słuchawek. Ale z jakiegoś powodu działa tylko raz z zapasowym odtwarzaczem muzyki. Mogę nacisnąć przycisk, aby zadzwonić, a to zatrzyma muzykę. Jeśli ponownie zacznę grać i ponownie nacisnąć przycisk pauzy, nie działa. Po ponownym uruchomieniu urządzenia zadziała ono jeszcze raz. Później jednak, z Pandorą, działa ona konsekwentnie tak, jak powinna.

Pomyślałem, że będę w stanie obejść to i po prostu zatrzymać się bez użycia KeyEvent. Próbowałem tego z AudioManager i innym intencją:

AudioManager mAudioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);  
    if (mAudioManager.isMusicActive()) { 
     Intent mediaIntent = new Intent("com.android.music.musicservicecommand"); 
     mediaIntent.putExtra("command", "pause"); 
     ctx.sendBroadcast(mediaIntent); 
    } 

To również działa i działa konsekwentnie. Ale jest to z natury delikatne, ponieważ wysyłając intencję bezpośrednio do odtwarzacza muzyki Android, jest to jedyny odtwarzacz, z którym będzie pracował. Brak kontroli nad Pandora, Last.FM itp. I potrzebuję go do pracy z większością odtwarzaczy muzycznych.

Po prostu nie jestem pewien, gdzie pójść dalej. Nie jestem wybredny, jeśli chodzi o to, jakie rozwiązanie otrzymuję, dopóki działa. Jeśli możesz mi pomóc w pracy KeyEvent, fantastycznie, jeśli masz zupełnie inne rozwiązanie, fantastyczne. Po prostu chcę, żeby to działało! Dzięki!

+0

Cokolwiek tu zrobisz, będzie "z natury delikatne". Co więcej, będzie mnóstwo odtwarzaczy multimedialnych, które całkowicie zignorują to wydarzenie. I jest całkowicie możliwe, że kiedyś system operacyjny zacznie blokować fałszywe zdarzenia "ACTION_MEDIA_BUTTON", tak jak blokują inne podobne sfałszowane zdarzenia. Jeśli piszesz własny odtwarzacz multimedialny, użyj funkcji fokusowania dźwięku w 'AudioManager', aby uzyskać fokus dźwiękowy. – CommonsWare

+0

Właściwie nie piszę własnego odtwarzacza multimedialnego. Wiem, że w Sklepie Play jest mnóstwo w pełni funkcjonalnych aplikacji, które zatrzymają muzykę po określonym czasie, ale nie jestem szczególnie zadowolony z żadnego z nich. Po prostu próbuję napisać własną wersję i muszę wstrzymać większość aplikacji muzycznych. – Geniusdog254

Odpowiedz

2

Aby wstrzymać dźwięk systemowy, nie rozpoczynamy intencji, lecz prosimy o fokusowanie dźwięku z systemu.

Więc kiedy chcesz wstrzymać wszystko wykonać następujące czynności (sugerowane w onCreate):

//The Variables we'll need to create 
AudioManager am; 
OnAudioFocusChangeListener af; 

//I do nothing with this listener, but it's required for the next step. 
af = new OnAudioFocusChangeListener() { 

     public void onAudioFocusChange(int focusChange) { 
      if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { 
       // Lower the volume 
      } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { 
       // Raise it back to normal 
      }  
     } 

}; 

//Do the actual pause 
am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
int request = am.requestAudioFocus(af, 
    AudioManager.STREAM_MUSIC, 
    AudioManager.AUDIOFOCUS_GAIN); 

Ale nie zapomnij puścić ostrości przy użyciu:

am.abandonAudioFocus(af); 
+0

Te, jeśli/else w odbiorniku są po prostu skopiowane z dokumentacji Androida i nic nie robić, można je usunąć. –

4

natknąłem to także. Dzięki twojemu opisowi, myślę, że rozumiem, co się dzieje. Wysyłasz zdarzenie kluczowe, ale nigdy klawisz tak, aby system myślał, że przycisk odtwarzania/pauzy jest ciągle naciskany. Użyłem tego kawałka kodu z powodzeniem.

Intent mediaEvent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); 
mediaEvent.putExtra(Intent.EXTRA_KEY_EVENT, event); 
context.sendBroadcast(mediaEvent); 

new Timer().schedule(new TimerTask() { 
    @Override 
    public void run() { 
     Intent mediaEvent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
     KeyEvent event = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_MEDIA_PLAY); 
     mediaEvent.putExtra(Intent.EXTRA_KEY_EVENT, event); 
     context.sendBroadcast(mediaEvent); 
    } 
}, 100); 
Powiązane problemy