EDIT: я должен был уже упомянуть об этом, но я запускаю этот код в службе. Все приложение включается / выключается кнопкой виджета и не имеет активности.
Обновление. Я попытался прикрепить исходники 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);