2017-08-08 20 views
0

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

+0

你到目前为止做了什么?在后台运行SpeechRecognizer并不是一个好主意,因为它会消耗太多的电池和互联网等资源。 –

+0

我不会在后台运行它,它会在条件满足时触发。 – sebklopfer

+0

您是否使用自定义侦听器而不是Google Prompt知道SpeechRecognizer? –

回答

1

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

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) { 

     } 
    } 

    } 
+0

太棒了!感谢堆 – sebklopfer

+0

没有probs。干杯! – Pavan