Android语音识别(SpeechRecognitizer)中的onReadyForSpeech()从未被调用

Android语音识别(SpeechRecognitizer)中的onReadyForSpeech()从未被调用,android,speech-recognition,Android,Speech Recognition,这是我的密码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_create_route); SetupButton(); } private void SetupButton() { Button createNewMessage = (But

这是我的密码:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_create_route);

    SetupButton();

}

private void SetupButton()
{
    Button createNewMessage = (Button) findViewById(R.id.button);

    createNewMessage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ListenForNewMessage();
        }
    });
}

private void ListenForNewMessage()
{
    final SpeechRecognizer newDeliverySpeech = SpeechRecognizer.createSpeechRecognizer(this);
    RecognitionListener newDeliveryRecognitionListener = new RecognitionListener() {
        @Override
        public void onReadyForSpeech(Bundle params) {
            Log.d("SpeechListening","onReadyForSpeech");
        }
        @Override
        public void onBeginningOfSpeech() {
            Log.d("SpeechListening","onBeginningOfSpeech");
        }

        @Override
        public void onRmsChanged(float rmsdB) {
            //do nothing
        }

        @Override
        public void onBufferReceived(byte[] buffer) {
            //do nothing
        }

        @Override
        public void onEndOfSpeech() {
            Log.d("SpeechListening","onEndOfSpeech");
        }

        @Override
        public void onError(int error) {
            //do nothing
        }

        @Override
        public void onResults(Bundle results) {
            ArrayList<String> userMessage;
            userMessage = results.getStringArrayList(RESULTS_RECOGNITION);
            PushNewDelivery(userMessage);
        }

        @Override
        public void onPartialResults(Bundle partialResults) {
            //do nothing
        }

        @Override
        public void onEvent(int eventType, Bundle params) {
            //do nothing
        }
    };
    newDeliverySpeech.setRecognitionListener(newDeliveryRecognitionListener);
    if (newDeliverySpeech.isRecognitionAvailable(getApplicationContext()))
    {
        Log.d("SpeechListening","started listening hopefully");
        newDeliverySpeech.startListening(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH));
    }
}
@覆盖
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u create\u route);
设置按钮();
}
私有void SetupButton()
{
Button createNewMessage=(Button)findViewById(R.id.Button);
createNewMessage.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
ListenForNewMessage();
}
});
}
私有void ListenForNewMessage()
{
最终语音识别器newDeliverySpeech=SpeechRecognizer.createSpeechRecognizer(此);
RecognitionListener newDeliveryRecognitionListener=new RecognitionListener(){
@凌驾
ReadyForSpeech上的公共void(Bundle参数){
Log.d(“SpeechListing”、“onReadyForSpeech”);
}
@凌驾
开始时的公共无效fSpeech(){
Log.d(“SpeechListing”、“OnBeginingOfspeech”);
}
@凌驾
在RMSCHANGED上的公共无效(浮动rmsdB){
//无所事事
}
@凌驾
已接收公共无效onBufferReceived(字节[]缓冲区){
//无所事事
}
@凌驾
公共无效onEndOfSpeech(){
Log.d(“SpeechListing”、“onEndOfSpeech”);
}
@凌驾
公共无效onError(内部错误){
//无所事事
}
@凌驾
公共结果(捆绑结果){
ArrayList用户消息;
userMessage=results.getStringArrayList(结果识别);
PushNewDelivery(userMessage);
}
@凌驾
public void onPartialResults(Bundle partialResults){
//无所事事
}
@凌驾
public void onEvent(int eventType,Bundle参数){
//无所事事
}
};
newDeliverySpeech.setRecognitionListener(newDeliveryRecognitionListener);
if(newDeliverySpeech.isRecognitionAvailable(getApplicationContext()))
{
Log.d(“SpeechListing”,“开始满怀希望地倾听”);
newDeliverySpeech.startListening(新意图(RecogenerIntent.ACTION_Recogener_SPEECH));
}
}
}

问题是,只记录了开始侦听的
RecognitionListener
从未调用过
onReadyForSpeech()
或其任何方法

细节 细节 细节 细节
有人能告诉我我做错了什么吗?

您基本上是在创建一个新的SpeechRecognitor对象,并在每次单击按钮时注册一个新的侦听器。除此之外,您还可以使用当前活动上下文创建SpeechRecognizer,但在调用isRecognitionAvailable()时实际上使用的是应用程序上下文

尝试将SpeechRecognitor创建为成员对象,并在调用onCreate()时注册侦听器。还要尽量避免使用应用程序上下文来避免内存泄漏

下面是一个你应该如何做的例子

private SpeechRecognizer mDeliverySpeech;
private Intent mSpeechIntent;
private boolean mListening = false;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_create_route);

    SetupButton();
    SetupSpeechRecognizer();

    mSpeechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

    mSpeechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en");
    mSpeechIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName());
    mSpeechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    mSpeechIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3);
}

private void SetupButton()
{
    Button createNewMessage = (Button) findViewById(R.id.button);

    createNewMessage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ListenForNewMessage();
        }
    });
}

private void SetupSpeechRecognizer() 
{
    mDeliverySpeech = SpeechRecognizer.createSpeechRecognizer(this);

     RecognitionListener newDeliveryRecognitionListener = new RecognitionListener() {
        @Override
        public void onReadyForSpeech(Bundle params) {
            Log.d("SpeechListening","onReadyForSpeech");
        }
        @Override
        public void onBeginningOfSpeech() {
            Log.d("SpeechListening","onBeginningOfSpeech");
        }

        @Override
        public void onRmsChanged(float rmsdB) {
            //do nothing
        }

        @Override
        public void onBufferReceived(byte[] buffer) {
            //do nothing
        }

        @Override
        public void onEndOfSpeech() {
            Log.d("SpeechListening","onEndOfSpeech");
        }

        @Override
        public void onError(int error) {
            //do nothing
        }

        @Override
        public void onResults(Bundle results) {
            ArrayList<String> userMessage;
            userMessage = results.getStringArrayList(RESULTS_RECOGNITION);
            PushNewDelivery(userMessage);
        }

        @Override
        public void onPartialResults(Bundle partialResults) {
            //do nothing
        }

        @Override
        public void onEvent(int eventType, Bundle params) {
            //do nothing
        }
    };

    mDeliverySpeech.setRecognitionListener(newDeliveryRecognitionListener);
}

private void ListenForNewMessage()
{   
    if (mDeliverySpeech.isRecognitionAvailable(this) && !mListening)
    {
        Log.d("SpeechListening","started listening hopefully");

        mListening = true;

        mDeliverySpeech.startListening(mSpeechIntent);

        new CountDownTimer(5000, 5000) {
             public void onTick(long millisUntilFinished) {}

             public void onFinish() {
                 mDeliverySpeech.stopListening();
                 mListening = false;
             }
          }.start();
    }
}
专用语音识别器mDeliverySpeech;
私人意图;
私有布尔mlisting=false;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u create\u route);
设置按钮();
SetupSpeechRecognizer();
mSpeechIntent=新意图(识别者意图、行动、识别、讲话);
mSpeechIntent.putExtra(RecognizerIntent.EXTRA_语言偏好,“en”);
mSpeechIntent.putExtra(RecognizerIntent.EXTRA_调用_包,this.getPackageName());
mSpeechIntent.putExtra(RecognizerIntent.EXTRA语言模型,RecognizerIntent.LANGUAGE模型自由形式);
mSpeechIntent.putExtra(RecognizerIntent.EXTRA\u MAX\u结果,3);
}
私有void SetupButton()
{
Button createNewMessage=(Button)findViewById(R.id.Button);
createNewMessage.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
ListenForNewMessage();
}
});
}
专用void SetupSpeechRecognizer()
{
mDeliverySpeech=SpeechRecognizer.createSpeechRecognizer(this);
RecognitionListener newDeliveryRecognitionListener=new RecognitionListener(){
@凌驾
ReadyForSpeech上的公共void(Bundle参数){
Log.d(“SpeechListing”、“onReadyForSpeech”);
}
@凌驾
开始时的公共无效fSpeech(){
Log.d(“SpeechListing”、“OnBeginingOfspeech”);
}
@凌驾
在RMSCHANGED上的公共无效(浮动rmsdB){
//无所事事
}
@凌驾
已接收公共无效onBufferReceived(字节[]缓冲区){
//无所事事
}
@凌驾
公共无效onEndOfSpeech(){
Log.d(“SpeechListing”、“onEndOfSpeech”);
}
@凌驾
公共无效onError(内部错误){
//无所事事
}
@凌驾
公共结果(捆绑结果){
ArrayList用户消息;
userMessage=results.getStringArrayList(结果识别);
PushNewDelivery(userMessage);
}
@凌驾
public void onPartialResults(Bundle partialResults){
//无所事事
}
@凌驾
public void onEvent(int eventType,Bundle参数){
//无所事事
}
};
mDeliverySpeech.setRecognitionListener(newDeliveryRecognitionListener);
}
私有void ListenForNewMessage()
{   
如果(mDeliverySpeech.isRecognitionAvailable(this)&!mlisting)
{
Log.d(“SpeechListing”,“开始满怀希望地倾听”);
m听=真;
mDeliverySpeech.startListening(mSpeechIntent);
新的倒计时(50005000){
公共void onTick(长毫秒直至完成){}
公共无效onFinish(){
mDeliverySpeech.stopListening()