2011-10-26 14 views
5

Nella documentazione, si dice:setStreamMute mai riattiva

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à riattivato automaticamente.

Le richieste di silenziamento per un determinato flusso sono cumulative: l'AudioManager può ricevere diverse richieste di silenziamento da uno o più client e lo streaming verrà riattivato solo quando viene ricevuto lo stesso numero di richieste di audio.

Bene, il primo paragrafo è vero; Ogni volta che il mio processo muore, tutti i flussi silenziati vengono automaticamente riattivati. Tuttavia, non importa quante volte chiamo setStreamMute(someStream, false), non si attiva MAI. L'ultima volta che ho provato a chiamarlo più di 1 milione di volte dopo aver disattivato solo ONCE e NOTHING!

Solo per citare - Se lo riattivo con lo stesso metodo, lo silenzio - rimane immutato. Ma alla prossima chiamata allo stesso metodo - non riattiva mai.

Sto muto in un metodo Ricevitore Broadcast su Ricevi, che inizio a utilizzare un gestore allarmi. Quindi forse perché la mia app è stata uccisa durante l'intervallo tra la chiamata di muting e quella di smorzamento? (Ma la mia applicazione rimane ancora in RAM)

Può essere questo problema perché io non sto tenendo un riferimento alle AlarmManager (Come istanze diverse di volta in volta?)

Qualcuno verificare questo problema?

risposta

21

Apperantly, non v'è un bug in queste versioni di Android; Testato per le versioni 2.2 e 2.3.3 e il bug esiste. Sembra che, se si chiama setStreamMute su un oggetto AudioManager:

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

e si perdere il vostro riferimento, quindi ottenere un riferimento nuova:

am = null; 
am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 

Non importa quanti molte volte chiami am.setStreamMute(..., false) ora, sarà mai unidire.

Penso rapporto malato questo bug ora ..

Lezione: Mantenere un riferimento statica al vostro AudioManager.

@Michell Bak, grazie per avermi dato l'idea di verificare se è il bug del software Android colpa.

+0

Sto usando una versione di Android 4.0 e lo stesso problema qui, dai un'occhiata http://stackoverflow.com/questions/14899395/how-to-mute-and-unmute-it-on-the-onpause- and-onresume –

+0

Mantieni un riferimento alla stessa istanza di 'AudioManager' (Preferibilmente come membro della tua classe di attività) – Jong

1

Non ho mai usato quell'API prima, ma una rapida ricerca su Google, ha restituito alcuni risultati che non funzionano. Sembra essere un bug che è ancora presente in Android 2.3:

http://code.google.com/p/android/issues/detail?id=4235

+0

Il mio progetto è su Android 2.2 – Jong

+0

Ma questo problema è che non è riuscito a disattivare l'audio, non è riuscito a riattivare l'audio. Hai visto altri risultati? Non ho – Jong

1

ho risolto il problema mettendo la variabile responsabile audio nell'applicazione

public class myApplication extends Application { 


    static AudioManager am; 
     public void onCreate() { 
    super.onCreate(); 
    am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
    this.setMute(false); 
     } 
    } 

Poi nella mia classe di attività di aggiungere questa funzione:

private AudioManager getAM() { 
return ((elpApplication)getApplication()).am; 

} 

e ecco come lo uso il Getam() ;

private void toogleMediaPlayerMute() { 

    //defaultVolumn = am.getStreamVolume(AudioManager.STREAM_MUSIC); 
    elpApplication app = getElpApp(); 
    Log.d("appmute", String.valueOf(app.isMute())); 
    if (!app.isMute()) { 
     getAM().setStreamVolume(AudioManager.STREAM_MUSIC, 0, 
       AudioManager.FLAG_PLAY_SOUND); 
     getAM().setStreamMute(AudioManager.STREAM_MUSIC, true); 
     ismute = true; 

    } else { 
     int maxVolume = getAM().getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
     Log.d("maxvol", String.valueOf(maxVolume)); 
     getAM().setStreamMute(AudioManager.STREAM_MUSIC, false); 
     getAM().setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, 
       AudioManager.FLAG_SHOW_UI); 

     ismute = false; 
     // app.setMute(ismute); 
    } 
    app.setMute(ismute); 
} 
+0

Sì, anche quella era la mia soluzione. Funziona. – Jong

0

Ho riscontrato lo stesso problema con le versioni più recenti dell'API. Quindi, per lavorare [intorno] a questo problema, ho implementato un po 'di soluzione "vecchia scuola". Se il disegno è tale che si gestisce ricevendo il flusso di byte/inviare direttamente il flusso di byte - inviare un array di byte pieno di zeri, se si seleziona mute: *

... 
byte[] whatToSend = realByteData; 
byte [] mutedOutput = new byte[recBuffSize]; 
Array.setByte(mutedOutput, 0, (byte) 0); 
... 
if (muteSet) 
    whatToSend = mutedOutput; 

amountWritten = audioTrack.write(whatToSend, 0, amountRead); 

*