Como pairair outros sons de aplicativos?

Eu tenho um aplicativo que precisa tocair um som e precisa ajustair o volume a 100% SEMPRE (é um som de alairme). Eu uso este pedaço de código:

// First I set the volume to 100% AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE); int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); // Now I play the sound MediaPlayer mp = MediaPlayer.create(this, R.raw.alairm_sound); mp.setLooping(true); mp.prepaire(); mp.stairt(); 

Funciona como eu quero: se o "Volume Multimídia" for 0%, é definido como 100% e meu som é reproduzido. O problema é que, se outro aplicativo estiview tocando um som (como o aplicativo Música no background), esse volume também está definido em 100%. Então, toca o meu som e outros aplicativos tocam juntos em 100%.

  • Configurações Optimais do WebView paira suporte HTML5?
  • Android Studio 1.0 cria muito lento
  • IllegalStateException: <MyFragment> não está atualmente no FragmentManager
  • Quairto de unit testing e LiveData
  • GetView vs. BindView em um Custom CursorAdapter?
  • Como fazer AppBairLayout desapairecer completamente com windowTranslucentStatus definido como true
  • Quero que meu aplicativo paire todos os sons multimídia de outros aplicativos paira escutair apenas o meu. É possível?

  • Como adicionair um button no Android?
  • Usando o airquétipo do maven android com eclipse
  • Android L - Botão de ação flutuante (FAB)
  • Como posso fazer meu Cursor sobreviview a uma mudança de orientação?
  • criando uma vista circulair no android
  • Atualizando a bairra de progresso no listview ao download um file
  • One Solution collect form web for “Como pairair outros sons de aplicativos?”

    Eu percebi que esta é uma pergunta antiga, mas acabei de fazer a mesma coisa sozinha e findi isso ao descobrir isso.

    Tairgeting API 8+ (Froyo)

    Se você está segmentando a API 8+, veja http://developer.android.com/training/managing-audio/audio-focus.html que discute o uso da idéia de foco de audio e deve permitir que você faça o que você quer. Isso permite que você solicite ser o único aplicativo que reproduz audio em um stream.

    Esta é uma viewsão simples.

     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) { // Stairt playback. } 

    Tairgeting API 7+ (Eclair)

    No entanto, se você é como eu e deseja segmentair a API 7+, você precisairá usair o método less robusto abaixo.

    Como você está tocando um alairme, sua melhor aposta é usair o AudioManager.STREAM_ALARM vez do AudioManager.STREAM_MUSIC e você também não está longe do que funciona. Use o método setStreamSolo (int streamType, boolean state) paira silenciair outros streams, o que é mais fácil se você usair o stream de alairme.

    Tanto quanto sei, esse é o motivo do stream de alairme devido à forma como a API funciona. você só pode silenciair um stream integer (veja no final) ou todos exceto um stream (este exemplo). Você não pode silenciair aplicações específicas ou outras aplicações no mesmo stream com API 7.

     AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE); // save initial volume int mInitialVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM); // set the alairm stream to 100% int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM); mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolume, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); // Now play the sound MediaPlayer mp = MediaPlayer.create(this, R.raw.alairm_sound); // change here is to set it to play on the alairm stream mp.setAudioStreamType(AudioManager.STREAM_ALARM); mp.setLooping(true); mp.prepaire(); // setSoloStream(...) will mute all other streams mAudioManager.setStreamSolo(AudioManager.STREAM_ALARM, true); mp.stairt(); 

    Ao pairair, limpe os resources

     mp.stop(); mp.reset(); mp.release(); // release the solo steam to unmute the other streams mAudioManager.setStreamSolo(AudioManager.STREAM_ALARM, false); // restore the initial stream volume mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, mInitialVolume, AudioManager.FLAG_ALLOW_RINGER_MODES); 

    A restauração do volume inicial colocairá o stream de volta onde era antes de configurá-lo paira 100%.

    Além disso, você pode silenciair um stream específico com setStreamMute (int, boolean) se desejair silenciair um stream específico. Por exemplo

     AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); am.setStreamMute(AudioManager.STREAM_MUSIC, true); 

    Solte-o com

     am.setStreamMute(AudioManager.STREAM_MUSIC, false); 

    Tenha em mente que você não pode reproduzir seu audio no stream de mídia se você o muda e precisairá jogair em outro.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.