另一个音乐播放器应用的暂停/恢复音乐的Android应用程序

14

在我的Android应用程序中,我正在使用MediaPlayer类播放不同的mp3文件。

用户正在使用默认音乐应用程序播放自己的音乐。

我想要:

  1. 暂停默认音乐应用程序的音乐。
  2. 开始从我的应用程序播放音乐。
  3. 当我的音乐播放完成后,我的应用将恢复用户的默认音乐。

我希望能够从我的应用程序暂停和恢复默认音乐播放器的音乐。

这是否可能?


参考http://stackoverflow.com/a/37374679/2254969。这里发布的答案现在已经过时了。 - Ankit Aggarwal
请在此答案中查找我针对不同Android版本请求音频焦点和停止后台音频的完整解决方案: https://dev59.com/AGUp5IYBdhLWcg3wRWBD#75508153 - Nijat Ahmadli
7个回答

12
以下代码将通过发送广播来暂停默认的MediaPlayer:

以下代码将通过发送广播来暂停默认的MediaPlayer:

AudioManager mAudioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);    

if (mAudioManager.isMusicActive()) {

    Intent i = new Intent("com.android.music.musicservicecommand");

    i.putExtra("command", "pause");
    YourApplicationClass.this.sendBroadcast(i);
} 

我在一个应用程序中播放了一个mp3文件,在另一个应用程序中编写了这段代码。但是它没有起作用。是否需要任何权限?或者这只能在一个应用程序内部工作? - AndroidDev
1
这仅适用于播放音乐。是否有其他方法适用于所有音乐应用程序?@Mcingwe - Muneef M

7

大家好,尝试使用以下代码,它对我有效:

// stop music player
AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
am.requestAudioFocus(null,AudioManager.STREAM_MUSIC,AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

//resume music player

am.abandonAudioFocus(null);

3
这是唯一对我有效的选项。它可以与Spotify、Play Music和Google Podcasts搭配使用。 - Adam Kis

7

使用以下代码控制当前播放的音乐。

    AudioManager mAudioManager = (AudioManager) c.getSystemService(Context.AUDIO_SERVICE);

if(mode == Config.MUSIC_NEXT) {
                KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT);
                mAudioManager.dispatchMediaKeyEvent(event);
            }else if(mode == Config.MUSIC_PLAY){
                KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY);
                mAudioManager.dispatchMediaKeyEvent(event);
            }
            else if(mode == Config.MUSIC_PREV){
                KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS);
                mAudioManager.dispatchMediaKeyEvent(event);
            }

实际上,这是我使用的所有音乐应用程序中唯一有效的代码。已验证过:

  • Google Play 音乐。
  • Apple Music。
  • OnePlus 音乐应用程序。

这里的Config.MUSIC_NEXT是什么,因为它在我的Android Studio中显示为红色。 - Ali Zahid

5
// pause
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "pause");
sendBroadcast(i);

// play
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "play");
sendBroadcast(i);

// next
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "next");
sendBroadcast(i);

// previous
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "previous");
sendBroadcast(i);

关于可用命令的更多信息:

public static final String SERVICECMD = "com.android.music.musicservicecommand";
public static final String CMDNAME = "command";
public static final String CMDTOGGLEPAUSE = "togglepause";
public static final String CMDSTOP = "stop";
public static final String CMDPAUSE = "pause";
public static final String CMDPLAY = "play";
public static final String CMDPREVIOUS = "previous";
public static final String CMDNEXT = "next";

1

它对我来说运行得非常好:

    KeyEvent ke = new KeyEvent(KeyEvent.ACTION_DOWN, 
    KeyEvent.KEYCODE_MEDIA_PAUSE);
    Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
    intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);

    // construct a PendingIntent for the media button and unregister it
    Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
    PendingIntent pi = PendingIntent.getBroadcast(context,
            0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/);
    intent.putExtra(Intent.EXTRA_KEY_EVENT, ke);
    sendKeyEvent(pi,context, intent);

    ke = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PAUSE);
    intent.putExtra(Intent.EXTRA_KEY_EVENT, ke);
    sendKeyEvent(pi, context, intent);

1
还有另一种解决方案,可以仅暂停正在播放的音乐播放器:
  1. implements AudioManager.OnAudioFocusChangeListener
  2. override methods which is suggested by the ide.
  3. call this function when it is needed :

    private void checkAudioFocus() {
        AudioManager mAudioManager = (AudioManager) getApplicationContext().getSystemService(AUDIO_SERVICE);  
        if(mAudioManager.isMusicActive())
        {
            int result = mAudioManager.requestAudioFocus(AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
        }
    }
    

0

你可以尝试这段代码,希望能对你有所帮助。

val audioManager = requireActivity().getSystemService(Context.AUDIO_SERVICE) as AudioManager   val focusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN).run {
        setAudioAttributes(AudioAttributes.Builder().run {
            setUsage(AudioAttributes.USAGE_GAME)
            setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            setOnAudioFocusChangeListener({  }, object : Handler() {})
            build()
        })
        setAcceptsDelayedFocusGain(true)
        build()
    }
    audioManager.requestAudioFocus(focusRequest)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接