2012-08-14 2 views
7

Ich implementiere eine RecognitionListener innerhalb einer Aktivität mit Tabbed-Fragment. Was passiert ist, wenn der Benutzer scrollt, wird das Fragment, das den Listener implementiert, erstellt/zerstört und auf meinem Nexus 7 und Galaxy Nexus hören Sie einen Sound, der mit dem RegonitionListener verbunden ist, oder vielleicht der SpeechRecognizer, der einsatzbereit ist. Welche Klasse auch immer den Ton verursacht, ich möchte dem Benutzer erlauben, sie zu deaktivieren. Mir ist klar, dass mein Problem derzeit darin besteht, dass ich ohne den Fokus des Benutzers zuhöre, den ich aufklären möchte. Ich möchte den Ton jedoch immer noch nicht standardmäßig hören und den Benutzer lieber auf den Benachrichtigungston einstellen lassen.Disable 'Bereit' Ton der Erkennung Listener

Also meine Frage ist das, ist es möglich, die Benachrichtigung Ton mit dem Hörer verbunden zu deaktivieren? Ich konnte das in den Dokumenten nicht finden.

+2

Ich denke, dass Sound vom Spracherkennungsdienst generiert wird, was bedeutet, dass es unwahrscheinlich ist, dass Ihre App das ändern kann, da ich keine Optionen für diesen Sound in den Systemeinstellungen oder dem offiziellen Sprachsuche-Popup sehe. Sie könnten versuchen, die Lautstärke während der Spracherkennung stumm zu schalten, aber das würde auch Hintergrundmusik stummschalten, die gerade läuft. – zapl

+0

Hintergrundmusik wird immer abgeschnitten, wenn der Erkennungs-Listener gestartet wird. Ich würde es jedoch vorziehen, einen Hack möglichst nicht zu benutzen. Requisiten für die Idee! –

Antwort

14

Wie zapl sagte, gibt es keine direkte Methode, das zu tun, aber Sie können versuchen, das Systemvolume zu stummschalten, und wie Sie, Tencent sagte, dass Sie jede Art von Hack vermeiden. Dann muss ich sagen, dass es keine Methode SO FAR gibt, dies zu tun, aber ich teile diese Tricklösung für diejenigen, die unter dem gleichen Problem leiden und einen "Hack" -Trick nicht stören. Nur ihre Stunden der Frustration zu retten.

Stummschalten Sie die Systemlautstärke für diese bestimmte Zeit, und deaktivieren Sie sie danach. Wie dies zu tun:

In Ihrer Klasse, erstellen Sie folgende Objekte

private AudioManager mAudioManager; 
private int mStreamVolume = 0; 

In Ihrem onCreate Verfahren Sie wie folgt.

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

Wenn Sie für die Spracherkennung starten hören, gehen Sie wie folgt

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 

in Ihrer Rede RecognitionListener Schnittstelle sollte es eine Methode onReadyForSpeech sein.

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 
    } 
} 

So können Sie einen Trick mit diesem lästigen Sound spielen. Natürlich wird auch jeder andere Ton für eine Sekunde stummgeschaltet.

+1

Ich setze die volumn in der Funktion 'public void onResults (Bundle results)' zurück. Weil es nach der Spracherkennung noch einen Ton gibt. – William

3

Vorherige Antwort ist OK, außer es wird wegen einer NullPointer-Ausnahme abstürzen (getStreamVolume wird für ein Null-Objekt aufgerufen). Um dies zu beheben, bevor die getStreamVolume Zeile hinzu:

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

0

Wenn Sie stop the end sound auch wollen, können Sie den Ton Aufhebung der Stummschaltung in onResults und onError statt onReadyForSpeech.

erstellen Handler als Member-Variable:

private Handler mHandler = new Handler(); 

Die RecognitionListener Methoden:

@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); 
} 

ich mit einem 300 Millisekunden Verzögerung getestet haben und es funktioniert. Kürzere Verzögerungen können ebenfalls funktionieren.