2012-11-05 43 views
4

在我的应用程序中,我直接使用SpeechRecognizer。我破坏活动的SpeechRecognizer的onPause我重新创建它在下面的onResume方法...SpeechRecognizer:未连接到识别服务

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首次安装时,语音识别服务被称为和认可情况properly.But时应用从暂停,如果我尝试识别语音我得到“语音识别:未连接到识别服务”错误

我在做什么错了?

+0

不要你有问题汽车无检测的话呢?说一句你对听众有些结果吗? –

+0

通过连续,你的意思是语音识别器不断运行背景? – JeeZ

+0

是的。看起来在onResults方法被调用后,服务会自杀。 –

回答

5

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

不破坏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

+0

有没有办法为主要活动恢复SpeechRecognizer,然后在移动到应用内的第二个活动时将其销毁。目前,我在SpeechRecognizer和Googles Speech to Text之间发生了两个独立活动之间的冲突。你能提供任何建议@JeeZ –

+0

对不起,延迟回复,是的,你可以这样做。首先在onRestart()中移出活动并再次实例化时,在活动的onStop()中销毁SpeechRecognizer。 – JeeZ