EDIT: Я должен был упомянуть об этом уже, но я запускаю этот код в службе. Все приложение включено/выключено кнопкой виджета и не имеет активности.SpeechRecognizer вызывает ANR ... Мне нужна помощь в речи Android API
Update: Я пытался прикреплением источников SDK в проект, чтобы я мог получить более точное представление о том, где сбой происходил, но из the looks of it, только общедоступные интерфейсы включены, которые, кажется, делают их гораздо менее полезно ... может ли кто-нибудь предложить хотя бы отладочный подход для решения этой проблемы? Я как бы застрял.
Я пытаюсь использовать андроида speech recognition package записи пользователя речь и переводить его в текст. К сожалению, когда я пытаюсь инициировать прослушивание, я получаю ошибку ANR, которая не указывает на что-то конкретное.
Как указывает API SpeechRecognizer, при попытке вызвать его из основного потока возникает RuntimeException. Это заставило бы меня задаться вопросом, была ли обработка слишком требовательна ... но я знаю, что другие приложения используют API Android для этой цели, и это, как правило, довольно быстро.
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);
Программное обеспечение тег развития является своего рода излишним ;-) Это больше для темы говорить о поле в целом. – SapphireSun
Спасибо, это имеет смысл. – tnunamak