MainActivity has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414ee400 that was originally bound here
19,958
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.
Author by
ezy
Updated on June 05, 2022Comments
-
ezy about 2 years
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?
-
John Jang about 6 yearsSo how you solve the
ServiceConnectionLeaked
error? -
Varun A M almost 6 yearsI used singleton class to solve it. Don't initialize it with different contexts, instead use singleton :)