РЕДАКТИРОВАТЬ : Я должен был уже упомянуть об этом, но я запускаю этот код в службе. Все приложение включается / выключается кнопкой виджета и неактивно.
Обновление : я пытался подключить источники SDK к проекту, чтобы я мог получить более точное представление о том, где произошел сбой, но из взгляды на него , только общедоступные API-интерфейсы включены, что делает их намного менее полезными ... Кто-нибудь может предложить хотя бы подход к отладке для решения этой проблемы? Я немного застрял.
Я пытаюсь использовать Android пакет распознавания речи для записи речи пользователя и перевода ее в текст. К сожалению, когда я пытаюсь инициировать прослушивание, я получаю ошибку ANR, которая не указывает ни на что конкретное.
Как указывает API SpeechRecognizer, выдается исключение 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);