如何将音频焦点返回到以前播放的应用程序?

时间:2013-03-08 05:24:19

标签: android android-mediaplayer android-audiomanager

我是Android应用程序开发的新手,并且我认为可能是一个非常简单的问题,但我无法解决如何做我想要的事情......

我有一个简单的应用程序,按下按钮时播放声音。声音播放后,我希望应用程序将音频返回到应用程序启动前播放的任何内容(例如,如果播放音乐应用程序,声音应该在播放时中断音乐,然后返回控制和恢复音乐播放。我尝试使用setOnCompletionListener方法,但没有任何乐趣。

以下是代码:

public class MainActivity extends Activity implements OnClickListener{

public MediaPlayer mp = null;
public ImageButton playm = null;
public AudioManager audioManager = null;

/** called when activity first created */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setVolumeControlStream(AudioManager.STREAM_MUSIC);
    audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

    //Sigh Button
    playm = (ImageButton) findViewById(R.id.sighButton);
    playm.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    if (v==playm){
        OnAudioFocus onAudioFocus=new OnAudioFocus(this);
        audioManager.requestAudioFocus(onAudioFocus, AudioManager.STREAM_MUSIC, 
                AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
        playSighSound();
    }
}

public void playSighSound(){
        mp = MediaPlayer.create(this, R.raw.ohboy); 
        try {
        mp.start();
        mp.setOnCompletionListener(new OnCompletionListener(){

            @Override
            public void onCompletion(MediaPlayer mp){
            mp.release();
            }
        });
        } catch (IllegalArgumentException e){
            e.printStackTrace();
        } catch (IllegalStateException e){
            e.printStackTrace();
        }
    }
}

class OnAudioFocus implements AudioManager.OnAudioFocusChangeListener{
    MainActivity onAudioFocus;

    public OnAudioFocus(MainActivity onAudioFocus){
        this.onAudioFocus = onAudioFocus;
    }


public void onAudioFocusChange(int focusChange) {
    switch(focusChange){
    case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
        onAudioFocus.playSighSound();
        break;

    }
}
}

1 个答案:

答案 0 :(得分:0)

我很快就知道了,但是这里是实现如何在需要时获得音频焦点并在完成音频播放后释放它的实现。

正在播放音频的后台应用程序将在您获得应用程序的音频焦点requestAudioFocus()时停止,并在释放音频焦点releaseAudioFocus()之后继续在停止的位置继续播放。

此外,请实现 API 26 及更高版本。

public class AudioFocusManager {

    Context context;
    private AudioFocusRequest audioFocusRequest;

    public AudioFocusManager(Context context) {
        this.context = context;
    }

    public void requestAudioFocus() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            audioFocusRequest =
                    new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
                            .build();
            getAudioManager().requestAudioFocus(audioFocusRequest);
        } else {
            getAudioManager().requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
        }
    }

    public void releaseAudioFocus() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            if (audioFocusRequest != null) {
                getAudioManager().abandonAudioFocusRequest(audioFocusRequest);
                audioFocusRequest = null;
            }
        } else {
            getAudioManager().abandonAudioFocus(null);
        }
    }

    private AudioManager getAudioManager() {
        return ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE));
    }
}