1

我是Android开发的小菜鸟,我正试图找出一种使用语音识别来启动我的应用程序的方法。我想在用户首次登录后开始在后台运行的RecognitionService。我想要不断运行并允许用户使用关键字启动应用程序。我将允许用户在设置活动中停止服务。目前,我能够启动该服务并使其在后台运行,但我一直无法知道如何调用RecognitionService中的onStartListening方法。任何解决这个问题的帮助都非常感谢如何实现语音识别以启动应用程序?

我的代码

public class VoiceRecognitionService extends RecognitionService { 

private SpeechRecognizer m_EngineSR; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.e("SimpleVoiceService", "Service started"); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.e("SimpleVoiceService", "Service stopped"); 
} 

@Override 
protected void onCancel(Callback listener) { 
    m_EngineSR.cancel(); 
} 

@Override 
protected void onStartListening(Intent recognizerIntent, Callback listener) { //<--How Do I call this method? 
    m_EngineSR.setRecognitionListener(new VoiceResultsListener(listener)); 
    m_EngineSR.startListening(recognizerIntent); 
} 

@Override 
protected void onStopListening(Callback listener) { 
    m_EngineSR.stopListening(); 
} 


/** 
* 
*/ 
private class VoiceResultsListener implements RecognitionListener { 

    private Callback m_UserSpecifiedListener; 

    /** 
    * 
    * @param userSpecifiedListener 
    */ 
    public VoiceResultsListener(Callback userSpecifiedListener) { 
     m_UserSpecifiedListener = userSpecifiedListener; 
    } 

    @Override 
    public void onBeginningOfSpeech() { 
     try { 
      m_UserSpecifiedListener.beginningOfSpeech(); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onBufferReceived(byte[] buffer) { 
     try { 
      m_UserSpecifiedListener.bufferReceived(buffer); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onEndOfSpeech() { 
     try { 
      m_UserSpecifiedListener.endOfSpeech(); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onError(int error) { 
     try { 
      m_UserSpecifiedListener.error(error); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

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

    @Override 
    public void onPartialResults(Bundle partialResults) { 
     try { 
      m_UserSpecifiedListener.partialResults(partialResults); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onReadyForSpeech(Bundle params) { 
     try { 
      m_UserSpecifiedListener.readyForSpeech(params); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onResults(Bundle results) { 
     try { 
      m_UserSpecifiedListener.results(results); 
      Log.e("SimpleVoiceService Results:", "Service stopped"); 

      ArrayList<String> result = results.getStringArrayList("results_recognition"); 

      Log.e("SimpleVoiceService Results:", result.get(0)); 
      if (result.isEmpty() == false) { 
       for (int i = 0; i<(result.size()-1);i++) { 
        if(result.get(i).equals("shoot back")||result.get(i).equals("Launch App")){ 
         Intent intent2 = new Intent("com.bmoney.testapp.MAIN_ACTIVITY"); 
         startActivity(intent2); 
         break; 

        } 
       } 
      } 



     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onRmsChanged(float rmsdB) { 
     try { 
      m_UserSpecifiedListener.rmsChanged(rmsdB); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

}

清单

<service android:name="com.bmoney.testapp.VoiceRecognitionService" android:exported="true" android:enabled="true"> 
     <intent-filter> 
      <action android:name="android.speech.RecognitionService" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </service> 

回答

0

虽然我还没有测试了这一点的机会,我想答案就在于this Android开发者博客文章。
虽然这个实现使用了“Ok Google”(我不知道这是否会让你困扰)。

总之你必须实现seachable activity并在AndroidManifest补充一点:

<activity android:name=".SearchableActivity"> 
    <intent-filter> 
     <action android:name="com.google.android.gms.actions.SEARCH_ACTION"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 
</activity> 
+0

这不是为我工作。我已经三重检查了所有内容,但无法将此搜索查询传送到我的应用程序。有没有人得到这个工作? – Chaitanya 2014-11-09 05:25:30

+0

呃...看起来应用程序需要在Play商店发布: https://plus.google.com/+AndroidDevelopers/posts/afSRdDQiy1N - 寻找Jarek Wilkiewicz的评论。接下来尝试。 – Chaitanya 2014-11-09 05:53:36