使用代码停止 Soundcloud 和 Saavn 等背景音乐播放器服务

Stopping background music player services like Soundcloud and Saavn using code

当我播放 'Soundcloud' 或 'Saavn' 音乐播放应用程序并启动我自己的应用程序时,Saavn 或 Soundcloud 中的音乐仍在后台播放。需要一种使用代码停止它的方法。怎么做 ?

我试过了 -

AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        String SERVICECMD = "com.android.music.musicservicecommand";
        String CMDNAME = "command";
        String CMDSTOP = "stop";

        if(mAudioManager.isMusicActive()) {
            Intent i = new Intent(SERVICECMD);
            i.putExtra(CMDNAME , CMDSTOP );
            HomeActivity.this.sendBroadcast(i);
        }

但它仅在 Android 的默认音乐播放器在后台播放而不是像 Saavn 和 Soundcloud 这样的第 3 方应用程序时才用于停止音乐。

我认为不可能停止另一个应用程序的服务,因为您可能不知道 processid,只有当您知道该应用程序的 Pid 时,您才能停止您的应用程序的服务

android.os.Process.killProcess(processIdKillService)

我发现的一个可能的解决方案是使用 AudioManager.requestAudioFocus(...) 函数

AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

代码示例:

int result = am.requestAudioFocus(focusChangeListener, //Request audio focus for playback
AudioManager.STREAM_MUSIC, //Use the music stream.
AudioManager.AUDIOFOCUS_GAIN); //Request permanent focus.

if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    // other app had stopped playing song now , so u can do u stuff now .
}

音频焦点依次分配给请求它的每个应用程序。这意味着如果另一个应用程序请求音频焦点,你的应用程序将失去它。 当 AudioFocus 发生变化时,通过 onAudioFocusChange 事件侦听器通知应用程序。此侦听器是 requestAudioFocus 函数中的第一个参数。

此侦听器应类似于:

private OnAudioFocusChangeListener focusChangeListener = new OnAudioFocusChangeListener() {
    public void onAudioFocusChange(int focusChange) {
        AudioManager am =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
        switch (focusChange) {
            case (AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK):
                //Lower the volume while ducking (not sure what ducking means really)
                break;
            case (AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) :
                //TODO: pause audio 
                break;
            case (AudioManager.AUDIOFOCUS_LOSS) :
                //TODO: pause audio
                break;
            case (AudioManager.AUDIOFOCUS_GAIN):
                //TODO: Return the volume to normal and resume if paused.
                break;
            default: break; //empty on default
        }
    }
};