8

在我的应用程序中,我直接使用 SpeechRecognizer。我销毁 Activity 的 SpeechRecognizer onPause 并在 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:未连接到识别服务”错误

我究竟做错了什么 ?

4

2 回答 2

5

我找到了问题的原因。在onPause方法中虽然SpeechRecognition.destroy()调用了方法,但我猜它只是分离了服务,但对象sr将指向某个实例并且它不会为空。将对象重置sr为 null 将解决问题。

不销毁方法中的SpeechRecognition对象onPause会阻止其他应用程序使用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();
}
于 2012-11-05T08:27:17.517 回答
2

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

于 2019-04-17T11:25:12.333 回答