9

我在选项卡式片段活动中实现了RecognitionListener 。发生的情况是,当用户滚动时,实现侦听器的片段被创建/销毁,并且在我的 Nexus 7 和 Galaxy Nexus 上,您会听到与 RegonitionListener 相关联的声音,或者可能是 SpeechRecognizer准备好使用。无论哪个类是声音的原因,我都希望允许用户禁用它。我现在意识到我的问题是我正在倾听而没有我正在解决的用户关注;但是,我仍然不想在默认情况下听到声音,而是更喜欢让用户选择接收通知声音。

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

4

3 回答 3

17

正如 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

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

这就是你可以用这种烦人的声音来耍花招的方法。显然,任何其他声音也将静音一秒钟。

于 2014-02-21T12:53:38.970 回答
4

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

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

于 2015-03-09T10:11:10.553 回答
1

如果您也想这样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 毫秒的延迟进行了测试,它可以工作。更短的延迟也可能起作用。

于 2017-08-30T18:30:33.930 回答