如何防止MediaPlayer在其他应用程序中启动

时间:2015-12-08 18:19:58

标签: android audio focus android-audiomanager

我尝试制作简单的媒体播放器应用程序仅用于个人/教育目的(播放特定的mp3文件),但我有其他应用程序的问题。我使用服务在后台播放声音。一切正常,但当我转向另一个媒体应用程序时,我仍然可以同时播放不同的歌曲。如何"告诉"到我的应用程序使用媒体播放器的系统,没有人可以使用媒体播放器,直到我的服务结束。当我通过AUDIOFOCUS_REQUEST_GRANTED检查AUDIOFOCUS_GAIN时,我使用AudioManager STREAM_MUSIC并开始播放我的歌曲。

播放我的音乐并设置我使用的前景通知

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
            AudioManager.AUDIOFOCUS_GAIN);

    if (AudioManager.AUDIOFOCUS_REQUEST_GRANTED == result) {

        this.startForeground();
        player.start();
    } 

1 个答案:

答案 0 :(得分:0)

你必须使用媒体播放器音频焦点实现,详细文档在这里:

http://developer.android.com/guide/topics/media/mediaplayer.html#audiofocus

音频焦点是分配给任何请求的应用程序之一,意味着如果您请求,任何其他使用它的应用程序将自动停止&你将开始使用音频,当你使用它时,如果有任何其他应用程序请求它,你的音频将被停止。通过您在请求音频焦点时注册的音频焦点更改侦听器的 onAudioFocusChange处理程序,将通知您音频焦点的丢失

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

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


if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
// other app had stopped playing song now , so u can do u stuff now .
}
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.
                           mediaPlayer.setVolume(0.2f, 0.2f);
                           break;
                           case (AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) :
                           pause();
                           break;

                           case (AudioManager.AUDIOFOCUS_LOSS) :
                           stop();
                           ComponentName component =new ComponentName(AudioPlayerActivity.this,MediaControlReceiver.class);
                           am.unregisterMediaButtonEventReceiver(component);
                           break;

                           case (AudioManager.AUDIOFOCUS_GAIN) :
                           // Return the volume to normal and resume if paused.
                           mediaPlayer.setVolume(1f, 1f);
                           mediaPlayer.start();
                           break;
                           default: break;
}
}
};