【问题标题】:Disable 'Ready' sound of recognition listener禁用识别侦听器的“就绪”声音
【发布时间】:2012-08-10 17:03:15
【问题描述】:

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

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

【问题讨论】:

  • 我猜声音是由语音识别服务生成的,这意味着您的应用不太可能改变它,特别是因为我在系统设置或官方语音中没有看到该声音的任何选项搜索弹出窗口。您可以尝试在语音识别过程中静音,但这也会静音任何可能正在进行的背景音乐。
  • 当识别监听器启动时,背景音乐无论如何都会被剪切。如果可能的话,我宁愿避免使用黑客。支持这个想法!

标签: android


【解决方案1】:

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

这就是你可以用这种烦人的声音来玩把戏的方法。显然任何其他声音也会静音一秒钟。

【讨论】:

  • 我在函数public void onResults(Bundle results) 中重置了音量。因为语音识别后还有声音。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多