С помощью ответа Julius Скрипкаускас Я использую следующий код:
, чтобы начать звуковой сигнал:
private void playSound(){
try{
Log.d(TAG, "request audio focus");
this.am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
int result=this.am.requestAudioFocus(afListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE);
if(result==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
Log.d(TAG, "audio focus granted");
this.player=new MediaPlayer();
this.player.setOnPreparedListener(new OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}});
this.player.setOnCompletionListener(new OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp) {
am.abandonAudioFocus(afListener);
}});
this.player.setAudioStreamType(AudioManager.STREAM_MUSIC);
this.player.setDataSource(getApplicationContext(), Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.sound));
this.player.prepareAsync();
}
}catch(Exception e){
Log.e(TAG, "error playing music." + e.getMessage(), e);
}
}
Слушатель: Я просто останавливаю звук, потому что я буду воспроизводить звук только после того, как был предоставлен фокус. Если звук будет получить прерван другим приложением, это не имеет значения ...
private AudioManager.OnAudioFocusChangeListener afListener = new AudioManager.OnAudioFocusChangeListener(){
@Override
public void onAudioFocusChange(int focusChange) {
Log.d(TAG, "audio focus changed" + Integer.toString(focusChange));
if(player==null){
// we don't play audio
return;
}
player.stop();
}};
Это важно учитывать, чтобы добавить OnCompletionListener
к игроку, куда звонить am.abandonAudioFocus(afListener)
немедленно освободить аудио фокуса после был воспроизведен звук.
'AudioManager' был правильным советом. но в моем случае я использую 'AUDIOFOCUS_TRANSIENT_EXCLUSIVE', поэтому я могу играть, и потом я освобождаю аудиофокус, чтобы все остальные приложения могли продолжать играть –