编辑:我应该已经提到了这一点,但我正在服务中运行此代码。整个应用程序由一个小部件按钮打开/关闭,并且没有任何活动。
更新:我尝试将 SDK 源附加到项目中,以便更准确地了解故障发生的位置,但从外观上看,仅包含公共 API,这似乎使它们不太有用。 . 任何人都可以建议至少一种调试方法来解决这个问题吗?我有点卡住了。
我正在尝试使用 Android 的语音识别包来记录用户语音并将其翻译成文本。不幸的是,当我尝试开始收听时,我收到了一个 ANR 错误,它没有指向任何特定的内容。
正如 SpeechRecognizer API 所指出的,如果您尝试从主线程调用它,则会引发 RuntimeException。这会让我想知道处理是否过于苛刻......但我知道其他应用程序为此目的使用 Android API,而且它通常非常活泼。
java.lang.RuntimeException: SpeechRecognizer should be used only from the application's main thread
这是我试图从我的服务中调用的代码的(修剪)示例。这是正确的方法吗?
感谢您花时间提供帮助。这一直是我无法克服的障碍。
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);