语音识别器:未连接到识别服务。

8
在我的应用程序中,我直接使用了SpeechRecognizer。我在Activity的onPause方法中销毁了SpeechRecognizer,并在onResume方法中重新创建它,代码如下:...
public class NoUISpeechActivity extends Activity {

protected static final String CLASS_TAG = "NoUISpeechActivity";
private SpeechRecognizer sr;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_no_uispeech);

    sr = getSpeechRecognizer();
}

@Override
protected void onPause() {

    Log.i(CLASS_TAG, "on pause called");
    if(sr!=null){
        sr.stopListening();
        sr.cancel();
        sr.destroy();       

    }

    super.onPause();
}


@Override
protected void onResume() {

    Log.i(CLASS_TAG, "on resume called");       

    sr = getSpeechRecognizer();

    super.onResume();
}

....

private SpeechRecognizer getSpeechRecognizer() {
    if(sr == null){
        sr = SpeechRecognizer.createSpeechRecognizer(getApplicationContext());
        CustomRecognizerListner listner = new CustomRecognizerListner();
        listner.setOnListeningCallback(new OnListeningCallbackImp());
        sr.setRecognitionListener(listner);
    }
    return sr;
}
}

当应用程序通过Eclipse首次安装时,会调用SpeechRecognition服务并正确识别语音。但是,当应用程序从暂停状态恢复时,如果尝试识别语音,则会出现“SpeechRecognition:未连接到识别服务”的错误。

我做错了什么?


你不会一直检测语音有问题吗?在收到听者的一些结果后再说? - Ε Г И І И О
你所说的“continuous”,是指语音识别器在后台持续运行吗? - Jeevan
是的。看起来在 onResults 方法被调用后,该服务会自行终止。 - Ε Г И І И О
2个回答

6
我找到了问题的原因。在onPause方法中,尽管调用了SpeechRecognition.destroy()方法,但我猜它只是分离了服务,但对象sr仍将指向某个实例并且不会为null。将对象sr重置为null将解决该问题。
onPause方法中不销毁SpeechRecognition对象将阻止其他应用程序使用SpeechRecognition服务。
@Override
protected void onPause() {

    Log.i(CLASS_TAG, "on pause called");
    if(sr!=null){
        sr.stopListening();
        sr.cancel();
        sr.destroy();              

    }
    sr = null;

    super.onPause();
}

1
是的,我认为最好使用延迟加载SpeechRecognizer对象。 - gregm
有没有一种方法可以在主要活动中恢复SpeechRecognizer,然后在应用程序内移动到第二个活动时销毁它。目前,在两个单独的活动中使用SpeechRecognizer和Google的语音转文本之间存在冲突。您能否提供任何建议@JeeZ - N MC
抱歉回复晚了,是的,你可以这样做。当你离开活动时,在活动的onStop()方法中销毁SpeechRecognizer实例,然后在onRestart()方法中重新实例化。 - Jeevan

3

只需要停止调用stopListening()和cancel()方法,而是仅调用destroy()方法。这应该可以解决问题 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接