SpeechRecognizer вызывает ANR ... Мне нужна помощь с API речи Android

EDIT : Я должен был уже упомянуть об этом, но я запускаю этот код в службе. Все приложение включается / выключается с помощью кнопки виджета и не работает.


Обновление : я попытался прикрепить исходники SDK к проекту, чтобы получить более точное представление о том, где произошел сбой, но из выглядит , включены только общедоступные API, что, кажется, делает их намного менее полезными ... может ли кто-нибудь предложить хотя бы подход отладки для решения этой проблемы? Я как бы застрял.


Я пытаюсь использовать пакет распознавания речи Android , чтобы записывать речь пользователя и переводить ее в текст. К сожалению, когда я пытаюсь инициировать прослушивание, я получаю ошибку ANR, которая не указывает ни на что конкретное.

Как показывает API SpeechRecognizer, при попытке вызвать его из основного потока возникает исключение 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 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);

12
задан tnunamak 2 January 2011 в 20:33
поделиться