2016-09-07 3 views
0

Я пишу приложение для предупреждения. Когда принимается предупреждение, я хочу остановить все текущие звуки (например, музыку) и воспроизвести звук оповещения. После того, как пользователь что-то сделал, и действие будет закрыто, предыдущие звуки должны продолжаться.Звуки остановки Android

То же, что и вы звоните. Как я могу достичь такого поведения?

ответ

1

Вы можете запросить audio focus. Как только вы закончите свой собственный звук, откажитесь от фокуса звука, чтобы другие приложения снова начали воспроизводить звук. Вы также будете уведомлены о других приложениях, запрашивающих аудиофокус, таким образом, имея возможность приостанавливать и возобновлять собственные звуки.

запрашивающая аудио фокуса:

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

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

if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { 
    am.registerMediaButtonEventReceiver(RemoteControlReceiver); 
    // Start playback. 
} 
+0

'AudioManager' был правильным советом. но в моем случае я использую 'AUDIOFOCUS_TRANSIENT_EXCLUSIVE', поэтому я могу играть, и потом я освобождаю аудиофокус, чтобы все остальные приложения могли продолжать играть –

0

С помощью ответа 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) немедленно освободить аудио фокуса после был воспроизведен звук.

Смежные вопросы