MainActivity a fui ServiceConnection android.de la parole.SpeechRecognizer de Connexion$@414ee400 qui a été à l'origine lié ici
Dans mon application je reconnais l'utilisateur indiquant "sortie" ou de "proximité" et de l'application doit fermer.
Avec ce 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;
}
}
}
}
J'obtiens cette erreur à l'exécution, après la reconnaissance de la parole.
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)
Si je tente de détruire la SpeechRecognizer je reçois une autre erreur d'exécution parce que sr
est null.
@Override
public void onDestroy(){
sr.destroy();
super.onDestroy();
}
Journal
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
Que dois-je faire?
OriginalL'auteur ezy | 2013-11-12
Vous devez vous connecter pour publier un commentaire.
Je pense que le problème peut être au niveau de ligne:
Si sr être null, vous obtenez NullPointerException, et
N'a été appelé. Essayez de faire ensuite:
ou:
sr.destroy();
jettejava.lang.NullPointerException
:sr
est nul donc je ne peux pas le détruire, mais il semble que tout simplement l'appel dethis.finish()
laisse ouvert le service de reconnaissance vocale. Je n'ai aucune idée de comment le fermer correctement à ce point.si vous êtes dans: switch(fonctionnement) de l'appel de cette.finir pourquoi avant cette.la finition que vous ne pas appeler sr.détruire?
si je l'appelle
sr.destroy()
avantthis.finish()
- je obtenir unjava.lang.NullPointerException
mettre en plein journal merci
Journal ajoutée pour les deux cas
OriginalL'auteur
Le problème a été la plus triviale que jamais: j'ai déclaré la
SpeechRecognizer
deux fois, une pour la classe et une autre à l'intérieur de laonCreate()
méthode. La variable a été initialisée seulement dans le domaine de la fonction, donc en dehors de la fonctionsr
était toujours null.ServiceConnectionLeaked
erreur?J'ai utilisé de la classe singleton pour le résoudre. Ne pas initialiser avec des contextes différents, au lieu d'utiliser un singleton 🙂
OriginalL'auteur ezy