2013-11-12 2 views
8

В моем приложении я узнаю, что пользователь говорит «exit» или «close», и приложение должно закрыть. С помощью этого кодаMainActivity просочился ServiceConnection [email protected], который был первоначально включен здесь

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; 
      } 
     } 
    } 
} 

Я получаю эту ошибку во время выполнения, после распознавания речи.

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 [email protected] 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 [email protected] 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) 

Если я пытаюсь уничтожить SpeechRecognizer я получаю другую ошибку во время выполнения, поскольку sr является недействительным.

@Override 
public void onDestroy(){ 
    sr.destroy(); 
    super.onDestroy(); 
} 

Вход

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 

Что я должен делать?

ответ

3

Проблема была самая тривиальная когда-либо: я объявил SpeechRecognizer два раза, один для класса, а другой внутри метода onCreate(). Переменная была инициализирована только в области функций, поэтому вне функции sr всегда было null.

6

Я думаю, что проблема может быть в строке:

sr.destroy(); 

Если стер быть пустым, вы получите NullPointerException и

super.onDestroy(); 

Dont был вызван. Попробуйте выполнить следующие действия:

if(sr!=null) 
{ 
    sr.destroy(); 
} 

или:

try{ 
     sr.destroy(); 
} 
catch (Exception e) 
{ 
Log.e(TAG,"Exception:"+e.toString()); 
} 
+0

Фактически 'sr.destroy();' throws 'java.lang.NullPointerException':' sr' равно null, поэтому я не могу его уничтожить, но кажется, что просто вызов 'this.finish()' оставляет открытым услуги распознавания речи. Я понятия не имею, как правильно его закрыть на этом этапе. – ezy

+0

если вы в: переключатель (работа) вызывающ это. Finish, почему before.finish вы не звоните sr.destroy? –

+0

если я назову 'sr.destroy()' before' this.finish() 'Я получаю' java.lang.NullPointerException' – ezy