2012-08-14 8 views
7

Implemento un RecognitionListener dentro de una actividad de fragmento con pestañas. Lo que sucede es que a medida que el usuario se desplaza, el fragmento que implementa el oyente se crea/destruye y en mi Nexus 7 y Galaxy Nexus escucha un sonido asociado al RegonitionListener, o quizás es el SpeechRecognizer, listo para su uso. Cualquiera sea la clase que sea la causa del sonido, me gustaría permitir que el usuario lo desactive. Me doy cuenta que actualmente mi problema es que estoy escuchando sin el enfoque de los usuarios que estoy resolviendo; sin embargo, todavía no quiero escuchar el sonido por defecto y prefiero permitir que el usuario opte por el sonido de notificación.Desactivar el sonido "Preparada" del detector de escucha

Así que mi pregunta es esta, ¿es posible desactivar el sonido de notificación asociado al oyente? No he podido encontrar esto en los documentos.

+2

Creo que el sonido es generado por el servicio de reconocimiento de voz, lo que significa que es poco probable que su aplicación cambie, especialmente porque no veo ninguna opción para ese sonido en la configuración del sistema o en la ventana de búsqueda de voz oficial. Podría intentar silenciar el volumen durante el reconocimiento de voz, pero eso también silenciaría cualquier música de fondo que pudiera estar en curso. – zapl

+0

La música de fondo se corta de todos modos cuando se inicia el oyente de reconocimiento. Sin embargo, preferiría evitar usar un truco si es posible. ¡Apoyos para la idea! –

Respuesta

14

Como zapl dijo que no hay un método directo para hacerlo, pero puede intentar silenciar el volumen del sistema y, como usted, Tencent dijo que está evitando cualquier tipo de ataque. Entonces debo decir que no hay un método TANTO para hacer esto, pero aún así estoy compartiendo esta solución truco para aquellos que están sufriendo del mismo problema y que quizás no les importe un truco de "hackeo". Solo ahorrando sus horas de frustración.

Silencie el volumen del sistema para ese momento en particular y luego desactive el silencio. Cómo hacer esto:

En su clase, cree siguientes objetos

private AudioManager mAudioManager; 
private int mStreamVolume = 0; 

En el método de onCreate hacer después.

mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 

Al iniciar la escucha de reconocimiento de voz, hace el siguiente

speechRecognizer.startListening(intent); // this method make that annoying sound 
mStreamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); // getting system volume into var for later un-muting 
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0); // setting system volume to zero, muting 

En su discurso RecognitionListener interfaz debe haber un método onReadyForSpeech.

class MyRecognitionListener implements RecognitionListener   
{ 
    public void onReadyForSpeech(Bundle params) 
    { 
    // this methods called when Speech Recognition is ready 
    // also this is the right time to un-mute system volume because the annoying sound played already 
    mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mStreamVolume, 0); // again setting the system volume back to the original, un-mutting 
    } 
} 

Así es como se puede jugar un truco con este sonido molesto. Obviamente, cualquier otro sonido también estará en silencio por un segundo.

+1

Restablezco la volumn en la función 'public void onResults (Bundle results)'. Porque hay otro sonido después del reconocimiento de voz. – William

3

La respuesta anterior es correcta, excepto que se bloqueará debido a una excepción de NullPointer (se está llamando a getStreamVolume en un objeto nulo). Para solucionar esto, antes de que la línea de getStreamVolume complemento:

AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

0

Si desea stop the end sound así, puede desactivar el sonido del sonido en onResults y onError en lugar de onReadyForSpeech.

crear un controlador como una variable miembro:

private Handler mHandler = new Handler(); 

Los RecognitionListener métodos:

@Override 
public void onResults(Bundle results) { 
    // Your logic here 
    startAudioSound(); 
} 

@Override 
public void onError(int errorCode) { 
    // Your logic here 
    startAudioSound(); 
} 

private void startAudioSound(long delay) { 
    mHandler.postDelayed(() -> { 
     mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mStreamVolume, 0); // again setting the system volume back to the original, un-mutting 
    }, 300); 
} 

He probado con un retardo de 300 milisegundos y funciona. Las demoras más cortas también pueden funcionar.

Cuestiones relacionadas