2012-06-30 49 views
5

該標題使得這個聲音比它更簡單..我試圖播放一個可以暫停大多數音樂播放器的意圖。在Android系統中可靠地暫停媒體播放系統

我知道我可以使用創建的KeyEvent爲將廣播KEYCODE_MEDIA_PLAY_PAUSE本:

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

這工作。它會暫停股票媒體播放器以及其他大多數支持耳機播放/暫停按鈕的音樂播放器。但由於某種原因,它只能與音樂播放器一起使用。我可以按下按鈕來調用它,它會暫停音樂。如果我再次開始播放,並再次點擊暫停按鈕,則無法使用。一旦我重新啓動設備,它將再次工作。但是,隨着潘多拉,它的工作原理應該如此。

我想我可以解決這個問題,只是暫停而不使用KeyEvent。我試着用AudioManager和其他意圖:

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

而且這也適用,它的工作原理一致。但它本質上是脆弱的,因爲通過將意圖直接發送到Android音樂播放器,這是唯一可以使用的播放器。沒有潘多拉,Last.FM等的控制,我需要它與大多數音樂播放器一起工作。

我只是不確定下一步該去哪裏。只要它有效,我不會挑剔給出什麼樣的解決方案。如果你能幫我做KeyEvent的工作,太棒了,如果你有一些完全不同的解決方案,太棒了。我只是想讓它工作!謝謝!

+0

你在這裏做的任何事情都是「固有的脆弱」。而且,會有很多媒體玩家完全無視這一事件。而且完全有可能有一天,操作系統將開始阻止僞造的ACTION_MEDIA_BUTTON事件,以阻止其他類似的僞造事件。如果您正在編寫自己的媒體播放器,請使用'AudioManager'中的音頻焦點功能來獲取音頻焦點。 – CommonsWare

+0

我實際上並沒有寫我自己的媒體播放器。我知道Play商店中有很多功能齊全的應用會在一段時間後停止播放音樂,但我對其中的任何應用都不滿意。我只是想自己寫一篇文章,而且我需要能夠暫停大部分音樂應用。 – Geniusdog254

回答

2

要暫停系統寬音頻,您不會啓動意圖,而是從系統請求音頻焦點。

所以,當你想暫停一切需要以下內容(建議的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); 

但不要忘了使用,讓焦點轉到:

am.abandonAudioFocus(af); 
+0

這些if/else語句在監聽器裏是剛剛從Android的文件複製,什麼也不做,你可以刪除它們。 –

4

我碰到這個跑以及。感謝您的描述,我想我明白髮生了什麼。您發送了keydown事件,但從未如此鍵入系統認爲播放/暫停按鈕被連續按下。我成功地使用了這段代碼。

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