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

时间:2012-08-14 11:54:54

标签: android

我在标签片段活动中实现RecognitionListener。会发生的事情是,当用户滚动时,创建/销毁实现侦听器的片段,在我的Nexus 7和Galaxy Nexus上,您听到与RegonitionListener或其SpeechRecognizer相关联的声音,准备好使用。无论哪个类是声音的原因,我想允许用户禁用它。我意识到目前我的问题是我正在倾听而没有我正在解决的用户关注点;但是,我仍然不希望默认听到声音,而是希望让用户选择通知声音。

所以我的问题是,是否可以禁用与监听器关联的通知声音?我无法在文档中找到这个。

3 个答案:

答案 0 :(得分:15)

正如zapl所说,没有直接的方法可以做到这一点,但你可以尝试静音系统音量,腾讯说,你正在避免任何类型的黑客攻击。然后我必须说没有方法可以做到这一点,但我仍然在为那些遭受同样问题的人分享这个技巧解决方案,并且可能不介意“黑客”技巧。只是节省他们的挫折时间。

将系统音量静音该特定时间,然后取消静音。怎么做:

在班上,创建以下对象

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

在您的语音 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
  }
}

这就是你可以用这种烦人的声音来玩耍的方法。显然,任何其他声音也会暂时静音。

答案 1 :(得分:3)

以前的答案是可以的,因为它会因为NullPointer异常而崩溃(在空对象上调用getStreamVolume)。要解决此问题,请在getStreamVolume行之前添加:

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

答案 2 :(得分:0)

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

将处理程序创建为成员变量:

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

我已经测试了300毫秒的延迟并且它可以工作。缩短延迟也可能有效。