MainActivity has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414ee400 that was originally bound here

android, serviceconnection, speech-recognition

Solution

The problem was the most trivial ever: I declared the `SpeechRecognizer` two times, one for the class and another inside the `onCreate()` method. The variable was initialized only in the function scope, so outside the function `sr` was always null.

Problem

In my app I recognize the user saying "exit" or "close" and the app should close. With this code ``` SpeechRecognizer sr; Map<String, Integer> dictionary; private static final int EXIT = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); populateDictionary(); SpeechRecognizer sr = SpeechRecognizer.createSpeechRecognizer(this); sr.setRecognitionListener(this); Intent voiceIntent = RecognizerIntent.getVoiceDetailsIntent(getApplicationContext()); sr.startListening(voiceIntent); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } private void populateDictionary() { dictionary = new HashMap<String, Integer>(); dictionary.put("exit", EXIT); dictionary.put("close", EXIT); } @Override public void onResults(Bundle results) { ArrayList<String> strList = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); for (int i = 0; i < strList.size();i++ ) { String sentence = strList.get(i).toLowerCase(Locale.getDefault()); Integer operation = dictionary.get(sentence); if(operation != null){ switch(operation){ case EXIT:{ this.finish(); };break; } } } } ``` I get this runtime error, after the speech recognition. ``` 11-12 15:38:05.351: E/Trace(14934): error opening trace file: No such file or directory (2) 11-12 15:38:05.511: D/libEGL(14934): loaded /system/lib/egl/libEGL_mali.so 11-12 15:38:05.521: D/libEGL(14934): loaded /system/lib/egl/libGLESv1_CM_mali.so 11-12 15:38:05.521: D/libEGL(14934): loaded /system/lib/egl/libGLESv2_mali.so 11-12 15:38:05.541: D/OpenGLRenderer(14934): Enabling debug mode 0 11-12 15:38:08.884: E/ActivityThread(14934): Activity com.example.voicetest01.MainActivity has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414f0e40 that was originally bound here 11-12 15:38:08.884: E/ActivityThread(14934): android.app.ServiceConnectionLeaked: Activity com.example.voicetest01.MainActivity has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414f0e40 that was originally bound here 11-12 15:38:08.884: E/ActivityThread(14934): at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:965) 11-12 15:38:08.884: E/ActivityThread(14934): at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:859) 11-12 15:38:08.884: E/ActivityThread(14934): at android.app.ContextImpl.bindService(ContextImpl.java:1214) 11-12 15:38:08.884: E/ActivityThread(14934): at android.app.ContextImpl.bindService(ContextImpl.java:1206) 11-12 15:38:08.884: E/ActivityThread(14934): at android.content.ContextWrapper.bindService(ContextWrapper.java:394) 11-12 15:38:08.884: E/ActivityThread(14934): at android.speech.SpeechRecognizer.startListening(SpeechRecognizer.java:281) 11-12 15:38:08.884: E/ActivityThread(14934): at com.example.voicetest01.MainActivity.onCreate(MainActivity.java:32) 11-12 15:38:08.884: E/ActivityThread(14934): at android.app.Activity.performCreate(Activity.java:5008) 11-12 15:38:08.884: E/ActivityThread(14934): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 11-12 15:38:08.884: E/ActivityThread(14934): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2027) 11-12 15:38:08.884: E/ActivityThread(14934): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2088) 11-12 15:38:08.884: E/ActivityThread(14934): at android.app.ActivityThread.access$600(ActivityThread.java:134) 11-12 15:38:08.884: E/ActivityThread(14934): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199) 11-12 15:38:08.884: E/ActivityThread(14934): at android.os.Handler.dispatchMessage(Handler.java:99) 11-12 15:38:08.884: E/ActivityThread(14934): at android.os.Looper.loop(Looper.java:137) 11-12 15:38:08.884: E/ActivityThread(14934): at android.app.ActivityThread.main(ActivityThread.java:4744) 11-12 15:38:08.884: E/ActivityThread(14934): at java.lang.reflect.Method.invokeNative(Native Method) 11-12 15:38:08.884: E/ActivityThread(14934): at java.lang.reflect.Method.invoke(Method.java:511) 11-12 15:38:08.884: E/ActivityThread(14934): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 11-12 15:38:08.884: E/ActivityThread(14934): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 11-12 15:38:08.884: E/ActivityThread(14934): at dalvik.system.NativeStart.main(Native Method) ``` If I try to destroy the SpeechRecognizer I get another runtime error because `sr` is null. ``` @Override public void onDestroy(){ sr.destroy(); super.onDestroy(); } ``` Log ``` 11-12 15:29:24.383: E/Trace(13724): error opening trace file: No such file or directory (2) 11-12 15:29:24.633: D/libEGL(13724): loaded /system/lib/egl/libEGL_mali.so 11-12 15:29:24.633: D/libEGL(13724): loaded /system/lib/egl/libGLESv1_CM_mali.so 11-12 15:29:24.643: D/libEGL(13724): loaded /system/lib/egl/libGLESv2_mali.so 11-12 15:29:24.673: D/OpenGLRenderer(13724): Enabling debug mode 0 11-12 15:29:29.047: D/AndroidRuntime(13724): Shutting down VM 11-12 15:29:29.047: W/dalvikvm(13724): threadid=1: thread exiting with uncaught exception (group=0x40ccf318) 11-12 15:29:29.047: E/AndroidRuntime(13724): FATAL EXCEPTION: main 11-12 15:29:29.047: E/AndroidRuntime(13724): java.lang.NullPointerException 11-12 15:29:29.047: E/AndroidRuntime(13724): at com.example.voicetest01.MainActivity.onResults(MainActivity.java:77) 11-12 15:29:29.047: E/AndroidRuntime(13724): at android.speech.SpeechRecognizer$InternalListener$1.handleMessage(SpeechRecognizer.java:442) 11-12 15:29:29.047: E/AndroidRuntime(13724): at android.os.Handler.dispatchMessage(Handler.java:99) 11-12 15:29:29.047: E/AndroidRuntime(13724): at android.os.Looper.loop(Looper.java:137) 11-12 15:29:29.047: E/AndroidRuntime(13724): at android.app.ActivityThread.main(ActivityThread.java:4744) 11-12 15:29:29.047: E/AndroidRuntime(13724): at java.lang.reflect.Method.invokeNative(Native Method) 11-12 15:29:29.047: E/AndroidRuntime(13724): at java.lang.reflect.Method.invoke(Method.java:511) 11-12 15:29:29.047: E/AndroidRuntime(13724): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 11-12 15:29:29.047: E/AndroidRuntime(13724): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 11-12 15:29:29.047: E/AndroidRuntime(13724): at dalvik.system.NativeStart.main(Native Method) 11-12 15:29:31.500: I/Process(13724): Sending signal. PID: 13724 SIG: 9 ``` What should I do?

Original source