编辑:我应该已经提到过了,但是我正在运行这个代码.整个应用程序通过小部件按钮打开/关闭,没有任何活动.
更新:我尝试将SDK源附加到项目中,以便我们能够更准确地了解发生故障的地方,但从the looks of it开始,仅包含公共API,这似乎使它们不那么有用…任何人都可以至少提出一个解决这个问题的调试方法?我有点卡住了
我正在尝试使用Android的speech recognition package来录制用户语音并将其翻译成文字.不幸的是,当我尝试开始侦听时,我得到一个不指向任何具体的ANR错误.
如SpeechRecognizer API所示,如果您尝试从主线程调用RuntimeException,则会抛出RuntimeException异常.这将使我想知道处理是否太苛刻,但是我知道其他应用程序使用Android API来达到这个目的,它通常很漂亮.
java.lang.RuntimeException:SpeechRecognizer只能从应用程序的主线程使用
这是一个(修剪)的示例,我试图从我的服务调用的代码.这是正确的做法吗?
感谢您抽出时间帮忙.这是我一直没有得到解决的障碍.
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"com.domain.app"); SpeechRecognizer recognizer = SpeechRecognizer .createSpeechRecognizer(this.getApplicationContext()); RecognitionListener listener = new RecognitionListener() { @Override public void onResults(Bundle results) { ArrayList<String> voiceResults = results .getStringArrayList(RecognizerIntent.EXTRA_RESULTS); if (voiceResults == null) { Log.e(getString(R.string.log_label),"No voice results"); } else { Log.d(getString(R.string.log_label),"Printing matches: "); for (String match : voiceResults) { Log.d(getString(R.string.log_label),match); } } } @Override public void onReadyForSpeech(Bundle params) { Log.d(getString(R.string.log_label),"Ready for speech"); } @Override public void onError(int error) { Log.d(getString(R.string.log_label),"Error listening for speech: " + error); } @Override public void onBeginningOfSpeech() { Log.d(getString(R.string.log_label),"Speech starting"); } }; recognizer.setRecognitionListener(listener); recognizer.startListening(intent);
解决方法
您不需要自己创建SpeechRecognizer类,也不需要实现RecognizerListener. Google让他们公开做得很好,但是它们看起来很复杂,可能仅供专家使用.
要从用户语音中获取文本,只需使用RecognizerIntent.ACTION_RECOGNIZE_SPEECH启动内置的语音识别器Activity,然后等待结果返回onActivityResult.看看这里的示例代码:
我把它从这篇文章.
http://developer.android.com/resources/articles/speech-input.html
祝你好运.