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はいくつかのインスタンスを指しており、null にはなりません。オブジェクトを null にリセットsrすると、問題が解決します。

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 に答える