В настоящее время я занимаюсь разработкой приложения с использованием API распознавания речи для группового проекта. Я фактически впервые реализовал это около месяца назад, и с тех пор это работало довольно хорошо.
Это очень просто, есть только кнопка изображения, которая запускает действие распознавания голоса при нажатии. Первый результат затем «анализируется» приложением (оператор switch, чтобы проверить, какие слова в нем содержатся).
У меня проблема в том, что когда я установил приложение на свой телефон в четверг, оно работало нормально. Но со вчерашнего дня это больше не работает! При нажатии кнопки открывается интерфейс распознавания голоса, он записывает то, что я говорю, а затем экран становится черным и вылетает.
Вот logcat, который я получаю при запуске приложения:
03-03 16:16:05.365: E/AndroidRuntime(12262): FATAL EXCEPTION: main
03-03 16:16:05.365: E/AndroidRuntime(12262): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1234, result=-1, data=Intent { (has extras) }} to activity {com.brice/com.brice.Main}: java.lang.NullPointerException
03-03 16:16:05.365: E/AndroidRuntime(12262): at android.app.ActivityThread.deliverResults(ActivityThread.java:2992)
03-03 16:16:05.365: E/AndroidRuntime(12262): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3035)
03-03 16:16:05.365: E/AndroidRuntime(12262): at android.app.ActivityThread.access$1100(ActivityThread.java:127)
03-03 16:16:05.365: E/AndroidRuntime(12262): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1189)
03-03 16:16:05.365: E/AndroidRuntime(12262): at android.os.Handler.dispatchMessage(Handler.java:99)
03-03 16:16:05.365: E/AndroidRuntime(12262): at android.os.Looper.loop(Looper.java:137)
03-03 16:16:05.365: E/AndroidRuntime(12262): at android.app.ActivityThread.main(ActivityThread.java:4507)
03-03 16:16:05.365: E/AndroidRuntime(12262): at java.lang.reflect.Method.invokeNative(Native Method)
03-03 16:16:05.365: E/AndroidRuntime(12262): at java.lang.reflect.Method.invoke(Method.java:511)
03-03 16:16:05.365: E/AndroidRuntime(12262): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
03-03 16:16:05.365: E/AndroidRuntime(12262): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
03-03 16:16:05.365: E/AndroidRuntime(12262): at dalvik.system.NativeStart.main(Native Method)
03-03 16:16:05.365: E/AndroidRuntime(12262): Caused by: java.lang.NullPointerException
03-03 16:16:05.365: E/AndroidRuntime(12262): at com.brice.Main.onActivityResult(Main.java:310)
03-03 16:16:05.365: E/AndroidRuntime(12262): at android.app.Activity.dispatchActivityResult(Activity.java:4649)
03-03 16:16:05.365: E/AndroidRuntime(12262): at android.app.ActivityThread.deliverResults(ActivityThread.java:2988)
03-03 16:16:05.365: E/AndroidRuntime(12262): ... 11 more
Полагаю, результат = -1 - вот в чем проблема, но я понятия не имею, как с этим справиться ...
Вот часть кода, которая относится к части распознавания речи:
/**
* Fire an intent to start the voice recognition activity.
*/
private void startVoiceRecognitionActivity() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1); //In order to only get the best result
startActivityForResult(intent, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
boolean success=false; //To check if the STT worked properly
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK)
{
// Populate the wordsList with the String value the recognition engine thought it heard
ArrayList<String> matches = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);
//Outputs the message
voiceIn.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, matches));
success=true;
}
//Get the result as a String
first = (String) voiceIn.getItemAtPosition(0);
super.onActivityResult(requestCode, resultCode, data);
if (success){
if (first.contains("slideshow")){
loadSlideshow();
}
else{
messageTo = first; //Take the speech as the message
//Post the message to the recipient
Functions.postData(messageTo, recipient);
//Notify Granny that the message is sent
//Toast.makeText(Main.this, "Message Sent", Toast.LENGTH_LONG).show(); //Text Notifier
tts.speak("Your message has been sent", TextToSpeech.QUEUE_ADD, null); //Speech Notifier
}
}
else{ //If the Speech to Text had a problem, notify the user
tts.speak("There was a problem with the Speech Recognition Service, you should try again", TextToSpeech.QUEUE_ADD, null); //Speech Notifier
}
Еще раз все работало нормально в течение последнего месяца и внезапно прекратилось вчера (я изменил код на своей машине, но не установил новую версию на свой телефон, поэтому на телефоне установлена та же версия, что и неделю назад, которая использовала на работу!)
Большое спасибо ..