在 Android 服务中触发语音识别

Trigger Speech Recognition in Android Service

我一直在尝试找到一种在服务(在后台运行)中实现 SpeechRecognizer API 的方法,以便在满足条件时打开语音识别器,而不必在应用。我的问题是这在本地是否可行?如果是这样,将如何完成?

这是我的代码片段。您可以在服务中使用这样的识别侦听器。 我不确定您如何安排服务,我已将其留给您。但是你可以做这样的事情。 (我没有添加重新启动服务的代码/在计时器中启动它等)

    public class MyService extends Service {
    protected static SpeechRecognizer mSpeechRecognizer;
    protected Intent mSpeechRecognizerIntent;
    Context c;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    //if condition is met then do this
        SpeechRecognitionListener h = new SpeechRecognitionListener();
        mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
        mSpeechRecognizer.setRecognitionListener(h);
        mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        Log.d("avail", " " + mSpeechRecognizer.isRecognitionAvailable(this));
        if (mSpeechRecognizer.isRecognitionAvailable(this))
            Log.d("created", "onBeginingOfSpeech");
        mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
                this.getPackageName());
        mSpeechRecognizer.startListening(mSpeechRecognizerIntent);

        return START_STICKY;
    }


    @Override
    public void onCreate() {
        super.onCreate();
        c= getApplicationContext();


    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }



    class SpeechRecognitionListener implements RecognitionListener {

        @Override
        public void onReadyForSpeech(Bundle bundle) {

            Log.d("onReady", "service");
        }

        @Override
        public void onBeginningOfSpeech() {
        }

        @Override
        public void onRmsChanged(float v) {

        }

        @Override
        public void onBufferReceived(byte[] bytes) {

        }

        @Override
        public void onEndOfSpeech() {

        }

        @Override
        public void onError(int i) {
            Log.d("ERROR","ERROR");
        }

        @Override
        public void onResults(Bundle resultsBundle) {
            Log.d("Results", "onResults"); 
        }

        @Override
        public void onPartialResults(Bundle bundle) {

        }

        @Override
        public void onEvent(int i, Bundle bundle) {

        }
    }

  }