2012-10-27 7 views
5

Ho creato una piccola app che silenzia/ripristina il flusso musicale utilizzando la classe AudioManager. Infatti, funziona finché non chiudo l'applicazione. Ad esempio, ho disattivato l'audio, chiudo l'app, riavvio l'app e il pulsante non riattiva più lo streaming. Ho cercato in rete ma nessuno sembra aver incontrato questo problema.Flussi di muting in Android

Ecco il mio codice:

public class ControlloVolume extends Activity { 
ToggleButton tb_mute; 
Button btn_mute; 
AudioManager mAudioManager; 
boolean mute; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_controllo_volume); 

    tb_mute = (ToggleButton) findViewById(R.id.tb_mute); 
    btn_mute = (Button) findViewById(R.id.btn_mute); 
    mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 

    if(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)==0){ 
     mute = true; 
     tb_mute.setChecked(mute); 
    }else{ 
     mute = false; 
     tb_mute.setChecked(mute); 
    } 

    } 

public void onButtonClicked(View view){ 
    if(!mute){ 
     mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, true); 
     tb_mute.setChecked(true); 
     mute = true; 
    }else{ 
     mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, false); 
     tb_mute.setChecked(false); 
     mute = false; 
    } 
} 
+1

Quando dici "chiudi", intendi che la tua app viene distrutta o viene semplicemente messa in secondo piano? GetStreamVolume restituisce 0 quando si riavvia l'app? – Michael

risposta

0

In primo luogo, attenzione it's not recommended

Per una migliore esperienza utente, le applicazioni devono attivare l'audio di un flusso in sordina in onPause() e disattivare l'audio di nuovo in onResume() se è appropriato.

Ma presumo tu sappia cosa stai facendo, quindi eccoci qui.

nota questa linea dalla documentazione sulla setStreamMute

Il comando di silenziamento è protetto contro la morte processo client: se un processo con una richiesta mute attiva su un flusso muore, questo flusso sarà essere riattivato automaticamente.

Ho controllato il mio dispositivo e infatti, appena esco dall'attività, il flusso rimane disattivato. Ma non appena avrò terminato il processo, il muto sparirà. Dai uno sguardo allo activity lifecycle.

Come il vostro approccio attuale non funziona in modo affidabile, si potrebbe scrivere un foreground service che attiverà il muto - avviare tale servizio dalla vostra attività. Inoltre è probabile che sia necessario il setStreamSolo.

Due importante cose.

  1. Volume==0 e muted NON sono la stessa cosa. Cioè lo streaming può avere volume == 0 ma non essere disattivato. Sebbene il flusso sia disattivato, il volume sarà sempre 0
  2. le richieste di mute sono cumulative. Cioè se hai impostato il silenziamento due volte, devi attivare l'audio due volte - il tuo codice non lo gestisce

Come nota a margine, per tale app probabilmente vorrai utilizzare widget anziché attività.


Off topic. Sembra sorprendentemente che molte persone non capiscano come funzionano i booleani. E come vedo regolarmente il codice come il tuo, ecco una riscrittura un po 'semplificata.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // ... setup just like you did 

    // boolean is just like any other type. You can assign not only 
    // constants, but expressions too 
    mute = (mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)==0); 
    tb_mute.setChecked(mute); 
} 

public void onButtonClicked(View view){ 
    mute = !mute; // invert value 
    mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, mute); 
    tb_mute.setChecked(mute); 
} 
+1

Che dire della nuova API di Android 6 (API 23) per adjustStreamVolume? Il "setStreamMute" è deprecato e si consiglia di utilizzare adjustStreamVolume. Il ripristino automatico del volume continua a funzionare anche quando l'app viene uccisa? Cosa è cambiato? –

+0

@androiddeveloper non lo so, non ho toccato Android per circa un anno –

+0

oh ok. grazie. –