Android语音识别应用程序无popup

我目前正在寻找与JAVA的职业生涯,并决定从build立一个应用程序开始。 我在这里有这个代码,我用它来触发语音识别

public class MainActivity extends Activity implements OnClickListener{ private static final int VR_REQUEST = 999; private ListView wordList; private final String LOG_TAG = "SpeechRepeatActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button speechBtn = (Button) findViewById(R.id.speech_btn); wordList = (ListView) findViewById (R.id.word_list); PackageManager packManager= getPackageManager(); List<ResolveInfo> intActivities = packManager.queryIntentActivities (new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); if (intActivities.size() !=0){ speechBtn.setOnClickListener(this); } else { speechBtn.setEnabled(false); Toast.makeText(this,"Oops - Speech Recognition Not Supported!", Toast.LENGTH_LONG).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClick(View v){ if (v.getId() == R.id.speech_btn) { listenToSpeech(); } } private void listenToSpeech() { //start the speech recognition intent passing required data Intent listenIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); //indicate package listenIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName()); //message to display while listening listenIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Say a word!"); //set speech model listenIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); //specify number of results to retrieve listenIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 10); //start listening startActivityForResult(listenIntent, VR_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //check speech recognition result if (requestCode == VR_REQUEST && resultCode == RESULT_OK) { //store the returned word list as an ArrayList ArrayList<String> suggestedWords = data. getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); //set the retrieved list to display in the ListView //using an ArrayAdapter wordList.setAdapter(new ArrayAdapter<String> (this, R.layout.word, suggestedWords)); } //this detects which one the user clicks wordList.setOnItemClickListener(new OnItemClickListener(){ //click listener for items within list public void onItemClick(AdapterView<?> parent, View view, int position, long id){ //cast the TextView wordView = (TextView) //retrive the chosen word String wordChosen= (String) wordView. //output for debugging Log.v(LOG_TAG, "chosen:" +wordChosen); }}); super.onActivityResult(requestCode, resultCode, data); } } 

在这个应用程序中,用户按下一个button,并显示与谷歌语音input屏幕,你可以点击一个button(它实际上是自动),你可以说话,它会停下来,它会显示它。 但我不想让这个窗口popup来。 而是让用户点击button,并能够说话,让应用程序自动停止并显示文本(它已经这样做)。

请! 我知道已经有表格显示如何做到这一点的答案,实际上用户名JEEZ在这里发布了一些代码 。

我不知道我是否理解把它放在我的项目文件中。 我是一个NOOB! 如果有人能帮助澄清这一点,我将非常感谢您的帮助。

这是我的代码:

 package com.example.speechrecognizertest; import android.os.Bundle; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.speech.RecognitionListener; import android.speech.RecognizerIntent; import android.speech.SpeechRecognizer; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; import android.widget.TextView; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { private static final int VR_REQUEST = 999; public static final String TAG = null; private ListView wordList; private final String LOG_TAG = "SpeechRepeatActivity"; private SpeechRecognizer mSpeechRecognizer; private Intent mSpeechRecognizerIntent; private boolean mIslistening; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button speechBtn = (Button) findViewById(R.id.speech_btn); wordList = (ListView) findViewById(R.id.word_list); PackageManager packManager = getPackageManager(); List<ResolveInfo> intActivities = packManager.queryIntentActivities( new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); 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()); if (!mIslistening) { mSpeechRecognizer.startListening(mSpeechRecognizerIntent); } else { speechBtn.setEnabled(false); Toast.makeText(this, "Oops - Speech Recognition Not Supported!", Toast.LENGTH_LONG).show(); } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } protected class SpeechRecognitionListener implements RecognitionListener { @Override public void onBeginningOfSpeech() { //Log.d(TAG, "onBeginingOfSpeech"); } @Override public void onBufferReceived(byte[] buffer) { } @Override public void onEndOfSpeech() { //Log.d(TAG, "onEndOfSpeech"); } @Override public void onError(int error) { mSpeechRecognizer.startListening(mSpeechRecognizerIntent); //Log.d(TAG, "error = " + error); } @Override public void onEvent(int eventType, Bundle params) { } @Override public void onPartialResults(Bundle partialResults) { } @Override public void onReadyForSpeech(Bundle params) { Log.d(TAG, "OnReadyForSpeech"); //$NON-NLS-1$ } @Override public void onResults(Bundle results) { //Log.d(TAG, "onResults"); //$NON-NLS-1$ ArrayList<String> suggestedWords = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); // matches are the return values of speech recognition engine // Use these values for whatever you wish to do wordList.setAdapter(new ArrayAdapter<String>(this, R.layout.word, suggestedWords)); } @Override public void onRmsChanged(float rmsdB) { } } 

Solutions Collecting From Web of "Android语音识别应用程序无popup"

AndroidManifest.xml

添加以下权限:

 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 

class级成员

 private SpeechRecognizer mSpeechRecognizer; private Intent mSpeechRecognizerIntent; private boolean mIslistening; 

在onCreate

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ......... ......... mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); 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()); SpeechRecognitionListener listener = new SpeechRecognitionListener(); mSpeechRecognizer.setRecognitionListener(listener); } 

在你的button监听器只使用这个代码

 if (!mIsListening) { mSpeechRecognizer.startListening(mSpeechRecognizerIntent); } 

在onDestroy

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

在你的活动内部创build内部类

 protected class SpeechRecognitionListener implements RecognitionListener { @Override public void onBeginningOfSpeech() { //Log.d(TAG, "onBeginingOfSpeech"); } @Override public void onBufferReceived(byte[] buffer) { } @Override public void onEndOfSpeech() { //Log.d(TAG, "onEndOfSpeech"); } @Override public void onError(int error) { mSpeechRecognizer.startListening(mSpeechRecognizerIntent); //Log.d(TAG, "error = " + error); } @Override public void onEvent(int eventType, Bundle params) { } @Override public void onPartialResults(Bundle partialResults) { } @Override public void onReadyForSpeech(Bundle params) { Log.d(TAG, "onReadyForSpeech"); //$NON-NLS-1$ } @Override public void onResults(Bundle results) { //Log.d(TAG, "onResults"); //$NON-NLS-1$ ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); // matches are the return values of speech recognition engine // Use these values for whatever you wish to do } @Override public void onRmsChanged(float rmsdB) { } } 

编辑2015年2月7日 :从ZakiMak和生来赢得这个问题的答案代码从这个问题的答案,使这一个更完整。

不要忘记添加以下权限:

 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 

这个职位已经很长时间了。 对于那些正在寻找的人来说,由Hoan提供的上述代码几乎已经完成,但是还有一条重要的线路缺失。 这两个问题和答案,我不知道如何没有这个工作。

您需要创buildSpeechRecognitionListener并将其设置为SpeechRecognizer的侦听器。 在我们调用SpeechRecognizer的startListening()方法之前,还必须完成它。

SpeechRecognitionListener listener = new SpeechRecognitionListener(); mSpeechRecognizer.setRecognitionListener(收听);

然后,您还需要从onError事件中删除侦听器。

我遇到了这个问题。 看起来像有startActivityForResult(...)将启用popup话筒,然后你可以在onActivityResult()处理响应。 但是,简单地joinstartActivityForResult搞乱了我的startListening(mSpeechRecognizerIntent) ,所以你可能需要做更多的调整。

 mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName()); startActivityForResult(recognizerIntent, 100); // call back onActivityResult(int requestCode, int resultCode, Intent data){...}