禁用识别监听器的“就绪”声音

我在选项卡片段活动中实现了RecognitionListener 。 会发生什么是当用户滚动,实现监听器的片段被创build/销毁,并且在我的Nexus 7和Galaxy Nexus上,您会听到与RegonitionListener或SpeechRecognizer关联的声音,可以使用。 无论哪一类是声音的原因,我想允许用户禁用它。 我意识到目前我的问题是我没有我正在解决的用户焦点正在倾听; 不过,我仍然不希望听到默认的声音,并希望让用户select通知声音。

所以我的问题是,是否有可能禁用与监听器相关的通知声音? 我一直无法在文档中find这个。

Solutions Collecting From Web of "禁用识别监听器的“就绪”声音"

正如zapl所说,没有直接的方法可以做到这一点,但是您可以尝试将系统音量设置为静音,而腾讯则表示您正在避免任何forms的黑客攻击。 那么我必须说,没有办法做到这一点,但我仍然分享这个伎俩的解决scheme,谁是同样的问题,可能不会介意一个“黑客”的伎俩。 只是节省他们的小时数的挫折。

将系统音量静音,然后取消静音。 这个怎么做:

在你的课堂上,创build下面的对象

private AudioManager mAudioManager; private int mStreamVolume = 0; 

在你的onCreate方法中做下面的事情。

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

当您开始收听语音识别时,请执行以下操作

 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 

在您的Speech RecognitionListener接口中,应该有一个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 } } 

这是你如何玩这个恼人的声音的伎俩。 显然任何其他声音也将静音一秒钟。

以前的答案是确定的,除了它会因为NullPointerexception(在空对象上调用getStreamVolume )而崩溃。 要解决这个问题,在getStreamVolume行之前添加:

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

如果您还想stop the end sound ,则可以取消onResultsonError的声音而不是onReadyForSpeech

创build一个处理程序作为成员variables:

 private Handler mHandler = new Handler(); 

RecognitionListener方法:

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

我已经testing了300毫秒的延迟,它的工作原理。 较短的延误也可能起作用。