Приложение Android для приостановки / возобновления воспроизведения музыки из другого приложения музыкального плеера

В моем приложении для Android я проигрываю разные mp3-файлы с помощью класса MediaPlayer.

Пользователь играет свою музыку с помощью музыкального приложения по умолчанию.

Я хочу:

  1. Приостановите воспроизведение музыки в музыкальном приложении по умолчанию.
  2. Начни проигрывать музыку из моего приложения.
  3. Когда моя музыка закончится, мое приложение возобновит воспроизведение музыки пользователя по умолчанию.

Я хочу приостановить и возобновить воспроизведение музыки в музыкальном проигрывателе по умолчанию из моего приложения.

Можно ли сделать это?


person Aniruddha Mukherjee    schedule 26.02.2011    source источник
comment
См. stackoverflow.com/a/37374679/2254969. Ответы, размещенные здесь, теперь устарели.   -  person Ankit Aggarwal    schedule 22.05.2016


Ответы (7)


Следующий код приостановит 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);
} 
person Mcingwe    schedule 17.10.2011
comment
Я проиграл mp3 файл в одном приложении, а в другом написал этот код. Но это не работает. Требуется ли разрешение? Или это работает только внутри одного приложения? - person AndroidDev; 09.09.2013
comment
Это работает только для воспроизведения музыки. есть ли другой способ, который будет работать для всех музыкальных приложений? @Mcingwe - person Muneef M; 28.07.2017

ребята, попробуйте следовать коду, у меня это сработало:

// 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);
person aolphn    schedule 11.06.2018
comment
Это единственное, что у меня сработало. Он работает со Spotify, Play Music, Google Podcasts. - person Adam Kis; 06.09.2018

Для управления воспроизведением музыки используйте этот код.

    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 Музыка
  • Музыкальное приложение OnePlus
person Muneef M    schedule 28.07.2017

// 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";
person Xar-e-ahmer Khan    schedule 25.02.2015

У меня это работает очень хорошо:

    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);
person Sajid2067    schedule 01.10.2018

Существует также другое решение, которое может только приостанавливать воспроизведение проигрываемого музыкального проигрывателя:

  1. реализует AudioManager.OnAudioFocusChangeListener
  2. методы переопределения, которые предлагает ide.
  3. вызовите эту функцию, когда это необходимо:

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

вы пробуете этот код, надеюсь, вам это поможет.

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)
person Ho Binh    schedule 01.07.2021