在Android系统中可靠地暂停媒体播放

在Android系统中可靠地暂停媒体播放,android,android-intent,Android,Android Intent,这个标题听起来比实际情况简单得多。。我正试图广播一个让大多数音乐播放器暂停的意图 我知道我可以使用创建一个KeyEvent来播放KEYCODE\u MEDIA\u PLAY\u PAUSE,并使用以下命令: long eventTime = SystemClock.uptimeMillis(); Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null); KeyEvent downEvent = n

这个标题听起来比实际情况简单得多。。我正试图广播一个让大多数音乐播放器暂停的意图

我知道我可以使用创建一个KeyEvent来播放KEYCODE\u MEDIA\u PLAY\u 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音乐播放器,它是唯一可以使用的播放器。无法控制Pandora、Last.FM等,我需要它与大多数音乐播放器配合使用


我只是不知道下一步该去哪里。只要有效,我对给出的解决方案并不挑剔。如果你能帮我让KeyEvent工作,太棒了,如果你有完全不同的解决方案,太棒了。我只是想让它工作!谢谢

要暂停系统范围的音频,您不需要启动意图,而是从系统请求音频焦点

因此,当您希望暂停所有操作时,请执行以下操作(在onCreate中建议):

但别忘了使用以下工具来转移注意力:

am.abandonAudioFocus(af);

我也碰到过这个。多亏了你的描述,我想我明白发生了什么。您发送keydown事件,但从不发送keyup,以便系统认为正在连续按下播放/暂停按钮。我成功地使用了这段代码

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

你在这里做的任何事情都是“天生脆弱的”。此外,将有大量媒体播放器完全忽视这一事件。而且,完全有可能有一天,操作系统会像阻止其他类似的伪造事件一样,开始阻止伪造的
操作\媒体\按钮
事件。如果您正在编写自己的媒体播放器,请使用
AudioManager
中的音频焦点功能获取音频焦点。我并不是在编写自己的媒体播放器。我知道Play Store上有很多功能齐全的应用程序,可以在一段时间后停止音乐,但我对其中任何一个都不是特别满意。我只是想写一个我自己的想法,我需要能够暂停大多数音乐应用程序。这些if/else在监听器中只是从Android的文档中复制的,不做任何事情,你可以删除它们。请注意,启动Android O时,你需要显式发送意图()
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);