2014-08-28 89 views
0

我在想,如何让设备在设备处于睡眠状态时使用语音识别来监听语音命令?我的想法是,即使屏幕锁定或屏幕超时,我也希望设备响应我的声音。如何在设备入睡时保持语音识别?

这可能吗?我曾尝试将此用作服务和界面,并在屏幕锁定后停止监听。我能接受这方面的帮助吗?这是我的班级。

public class VoiceEngineService extends Activity { 

    private boolean isSpeakingDone = false; // default setting 
    private SpeechRecognizer sr = SpeechRecognizer.createSpeechRecognizer(this); 

    private AudioManager mAudioManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.wait_for_speech); 

      // mute beep sound 
      mAudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true); 

      sr.setRecognitionListener(new listener()); 
      Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
      i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
        RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); // LANGUAGE_MODEL_WEB_SEARCH 
      i.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getApplication() 
        .getClass().getName()); 
      i.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 6); 
      i.putExtra(RecognizerIntent.EXTRA_PROMPT, ""); 
      i.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 5500); 
      sr.startListening(i); 
    } 

    class listener implements RecognitionListener { 

     @Override 
     public void onReadyForSpeech(Bundle params) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onBeginningOfSpeech() { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onRmsChanged(float rmsdB) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onBufferReceived(byte[] buffer) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onEndOfSpeech() { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onError(int error) { 
      // TODO Auto-generated method stub 
      if (SharedPref.getVoiceController() == false) { 
       sr.cancel(); 
       Intent i = new Intent(); 
       sr.startListening(i); 
      } else { 
       sr.stopListening(); 
       sr.destroy(); 
       finish(); 
      } 

     } 

     @Override 
     public void onResults(Bundle results) { 
      // TODO Auto-generated method stub 
      isSpeakingDone = true; 
      ArrayList<String> mDataList = results 
        .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
      Intent i = new Intent(); 
      i.putStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS, mDataList); 
      setResult(RESULT_OK, i); 
      finish(); 
     } 

     @Override 
     public void onPartialResults(Bundle partialResults) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onEvent(int eventType, Bundle params) { 
      // TODO Auto-generated method stub 
     } 

    } // end listener class 

    @Override 
    protected void onPause() { 
     if ((isSpeakingDone == false)) { 
      finish(); 
     } 
     super.onPause(); 
    } 

    @Override 
    protected void onStop() { 
     // when speaking is true finish() has already been called 
     if (isSpeakingDone == false) { 
      finish(); 
     } 
     super.onStop(); 
    } 

    @Override 
    protected void onDestroy() { 
     sr.stopListening(); 
     sr.destroy(); 

     super.onDestroy(); 
    } 
} 
+0

您是否研究过其他应用程序(例如闹钟,天气)如何执行此操作?这看起来很有趣。祝你好运! – jpaugh 2014-08-28 00:12:52

回答

2

您必须在服务中实现语音监听器。创建一个扩展'服务'的类并组成一些逻辑来照顾录音。

如果您已经尝试过该服务,那么可能是因为您尝试将命令重定向到最有可能被Android OS阻止的活动。通常当谈到做手机处于锁定模式时,你只能希望完成一项或多项服务中的任务。

当你在Activity中时,当然这个活动超出了范围,它将被Android OS关闭。但是服务仍然可以在后台运行,除非您自己的代码明确地关闭它,或者在极少数情况下,Android会认识到它需要内存和处理器能力来完成其他任务。

+0

换句话说,所涉及的一切都必须是服务?哦, – jpaugh 2014-08-28 01:05:15

+0

我会再试一次,你是对的。我的实现是错误的。 – portfoliobuilder 2014-08-28 04:37:22