使用代码停止 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
}
}
};
当我播放 '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
}
}
};