2012-06-30 47 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);