2

ここでソリューションを使用しています: Android 4.1 & 4.2 のサービスとしての Android Speech Recognition以下のコードは onStartCommand() メソッドを取得しますが、onReadyForSpeech() がメソッドが呼び出されることはありません。

更新:追加したので、onReadyForSpeech()を呼び出すことができましたが、onReadyForSpeech()メソッドが完了するとonError()がエラーコードで呼び出されます:6 onReadyForSpeech()メソッドが完了した後(開始コードが再び開始されるため、これは連続ループに入ります) onError() が呼び出された後)。以下の Hoan Nguyen の状態のように、エラー コード 6 は ERROR_SPEECH_TIMEOUT ですが、音声認識ダイアログが表示されないので、話し始めることを知っています。また、ダイアログが表示されずにこのコードを開始した直後に話し始めようとしましたが、それでもエラー コード 6 が表示されます。

更新 (9-06-13): Hoan が述べたように、ダイアログは表示されません。リスニングが呼び出されるとすぐに話し始めます。しかし、すべての onResult() が呼び出された後にリスナーを再起動しようとする別の問題に遭遇しました...その問題とこの完全なコードはここにあります: Android Speech Speech Recognition: Repeated Calling of SpeechRecognizer.startListening() fails on JB 4.1.2

サービスを呼び出す私のアクティビティ コード:

startService(new Intent(VoiceRecognition.this, VoiceRecogService.class));

私のサービス:

public class VoiceRecogService extends Service
    {
        protected AudioManager mAudioManager; 
        protected SpeechRecognizer mSpeechRecognizer;
        protected Intent mSpeechRecognizerIntent;
        protected final Messenger mServerMessenger = new Messenger(new IncomingHandler(this));

        protected boolean mIsListening;
        protected volatile boolean mIsCountDownOn;

        static final int MSG_RECOGNIZER_START_LISTENING = 1;
        static final int MSG_RECOGNIZER_CANCEL = 2;

        private int mBindFlag;
        private Messenger mServiceMessenger;

        @Override
        public void onCreate()
        {
            super.onCreate();
            mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
            mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
            mSpeechRecognizer.setRecognitionListener(new SpeechRecognitionListener());
            mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                                             RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
            mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
                                             this.getPackageName());

            //mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
        }

        protected static class IncomingHandler extends Handler
        {
            private WeakReference<VoiceRecogService> mtarget;

            IncomingHandler(VoiceRecogService target)
            {
                mtarget = new WeakReference<VoiceRecogService>(target);
            }


            @Override
            public void handleMessage(Message msg)
            {
                final VoiceRecogService target = mtarget.get();

                switch (msg.what)
                {
                    case MSG_RECOGNIZER_START_LISTENING:

                        if (Build.VERSION.SDK_INT >= 16);//Build.VERSION_CODES.JELLY_BEAN)
                        {
                            // turn off beep sound  
                            target.mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);
                        }
                         if (!target.mIsListening)
                         {
                             target.mSpeechRecognizer.startListening(target.mSpeechRecognizerIntent);
                             target.mIsListening = true;
                            //Log.d(TAG, "message start listening"); //$NON-NLS-1$
                         }
                         break;

                     case MSG_RECOGNIZER_CANCEL:
                          target.mSpeechRecognizer.cancel();
                          target.mIsListening = false;
                          //Log.d(TAG, "message canceled recognizer"); //$NON-NLS-1$
                          break;
                 }
           } 
        } 

        // Count down timer for Jelly Bean work around
        protected CountDownTimer mNoSpeechCountDown = new CountDownTimer(5000, 5000)
        {

            @Override
            public void onTick(long millisUntilFinished)
            {
                // TODO Auto-generated method stub

            }

            @Override
            public void onFinish()
            {
                mIsCountDownOn = false;
                Message message = Message.obtain(null, MSG_RECOGNIZER_CANCEL);
                try
                {
                    mServerMessenger.send(message);
                    message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING);
                    mServerMessenger.send(message);
                }
                catch (RemoteException e)
                {

                }
            }
        };

        @Override
        public int onStartCommand (Intent intent, int flags, int startId) 
        {
            //mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
            try
            {
                Message msg = new Message();
                msg.what = MSG_RECOGNIZER_START_LISTENING; 
                mServerMessenger.send(msg);
            }
            catch (RemoteException e)
            {

            }
            return  START_NOT_STICKY;
        }

        @Override
        public void onDestroy()
        {
            super.onDestroy();

            if (mIsCountDownOn)
            {
                mNoSpeechCountDown.cancel();
            }
            if (mSpeechRecognizer != null)
            {
                mSpeechRecognizer.destroy();
            }
        }

        protected class SpeechRecognitionListener implements RecognitionListener
        {

            @Override
            public void onBeginningOfSpeech()
            {
                // speech input will be processed, so there is no need for count down anymore
                if (mIsCountDownOn)
                {
                    mIsCountDownOn = false;
                    mNoSpeechCountDown.cancel();
                }               
                //Log.d(TAG, "onBeginingOfSpeech"); //$NON-NLS-1$
            }

            @Override
            public void onBufferReceived(byte[] buffer)
            {
                String sTest = "";
            }

            @Override
            public void onEndOfSpeech()
            {
                Log.d("TESTING: SPEECH SERVICE", "onEndOfSpeech"); //$NON-NLS-1$
             }

            @Override
            public void onError(int error)
            {
                if (mIsCountDownOn)
                {
                    mIsCountDownOn = false;
                    mNoSpeechCountDown.cancel();
                }
                 mIsListening = false;
                 Message message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING);
                 try
                 {
                        mServerMessenger.send(message);
                 }
                 catch (RemoteException e)
                 {

                 }
                //Log.d(TAG, "error = " + error); //$NON-NLS-1$
            }

            @Override
            public void onEvent(int eventType, Bundle params)
            {

            }

            @Override
            public void onPartialResults(Bundle partialResults)
            {

            }

            @Override
            public void onReadyForSpeech(Bundle params)
            {
                if (Build.VERSION.SDK_INT >= 16);//Build.VERSION_CODES.JELLY_BEAN)
                {
                    mIsCountDownOn = true;
                    mNoSpeechCountDown.start();
                    mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, false);
                }
                Log.d("TESTING: SPEECH SERVICE", "onReadyForSpeech"); //$NON-NLS-1$
            }

            @Override
            public void onResults(Bundle results)
            {
                //Log.d(TAG, "onResults"); //$NON-NLS-1$

            }

            @Override
            public void onRmsChanged(float rmsdB)
            {

            }



        }

        @Override
        public IBinder onBind(Intent arg0) {
            // TODO Auto-generated method stub
            return null;
        }
    }
4

0 に答える 0