Domanda

Ciao io sono nuovo a questo. Il mio progetto di auto-insegnamento è una piccola applicazione che svolge un flusso di notizie audio. Per essere efficace, l'applicazione ha davvero bisogno di interrompere eventuali lettori multimediali attualmente in riproduzione (ad esempio: Last FM, Imeem, lettore musicale, Spotify, ecc).

Non so che cosa ci sarà o quale applicazione sarà giocare, ma voglio chiedere a tutti di mettere in pausa fino a quando ho fatto. Suona piuttosto audace, lo so, ma deve essere possibile, perché quando c'è una chiamata in entrata, che è fondamentalmente ciò che accade.

Posso inviare un messaggio a tutti i lettori audio chiedendo loro di mettere in pausa per un momento? Potrei spoofing di una chiamata in arrivo, solo per il tempo che ci vuole?

Grazie.

È stato utile?

Soluzione

sezioni Audio su Android sta per essere abbastanza orribile per un po '. Le API sono abbastanza strano, poco documentata, e continuano a cambiare / ironico / rottura tra le versioni. Anche il codice AudioManager ha FIXME in esso.

In ogni caso, ci sono diversi tipi di flusso in Android (musica, notifiche, telefonate, ecc) e le applicazioni sono pensati per scegliere quella appropriata per la riproduzione. Immagino che la maggior parte delle applicazioni Android dovrebbe utilizzare il / tipo di supporto musicale (STREAM_TYPE_MUSIC). È possibile impostare questo sul vostro MediaPlayer utilizzando il metodo setAudioStreamType.

L'SDK non consentono di impostare un singolo flusso di tipo come solista - causando tutti gli altri corsi d'acqua per essere disattivato - ma io non credo che si possa identificare l'audio riprodotto da particolari applicazioni e in qualche modo mettere in pausa / riattivare esso. Applicazioni musicali in generale, utilizzeranno il PhoneStateListener per mettere in pausa se stessi quando arriva una chiamata.

Quindi nel tuo caso, si potrebbe "prendere in prestito" il flusso di chiamata per il vostro MediaPlayer e utilizzare il AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true) metodo di chiamata quando la riproduzione inizia, quindi un-solo il flusso con false quando la riproduzione o la vostra Activity è fatto.

posso dirvi che questo funziona, ma non riesco a ricordare due piedi se è necessario impostare anche l'audio modalità per MODE_IN_CALL quando si utilizza il flusso di chiamata vocale (come questo: AudioManager.setMode(AudioManager.MODE_IN_CALL)). Se si scopre che è necessario, quindi è necessario assicurarsi che si ritorna alla modalità di riproduzione MODE_NORMAL una volta completata, altrimenti ogni volta che si premono i tasti del volume duri, si dirà "In-chiamata del volume"! Tuttavia, se e quando si vuole tornare al MODE_NORMAL, è necessario verificare che una telefonata vera e propria non sta avvenendo in quel momento ...

Forse si potrebbe utilizzare un altro tipo di flusso piuttosto che la chiamata vocale, ma io sto solo parlando per esperienza lavorando su un app che potrebbe utilizzare il vivavoce o l'auricolare per la riproduzione audio, che richiede l'uso del flusso di chiamata vocale.

Come ho detto, la manipolazione audio non è particolarmente divertente ...;)

Altri suggerimenti

E 'stato 2 anni. Ma spero che questo potrebbe aiutare qualcuno:

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

Nota: se si chiama setStreamMute (int, boolean) per disattivare il flusso di n volte, è necessario chiamare lo n i tempi di nuovo per attivare l'audio (uso false).

Si può provare a AudioManager.adjustVolume metodo :

AudioManager audioMan = 
    (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
    AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top