2013-08-04 15 views
8

Sto avendo un problema davvero strano.Eccezione finestra trapelata anche se non viene utilizzato alcun servizio

Continuo a ottenere questo arresto nel mio logcat, ma la cosa strana è che la mia app non ha nulla a che fare con la cosa Text To Speech. non solo questa attività, la mia intera app non la usa affatto.

08-04 03:47:19.321: E/ActivityThread(24755): Activity com.lablabla.similarsearch.WebViewActivity has leaked ServiceConnection [email protected] that was originally bound here 
08-04 03:47:19.321: E/ActivityThread(24755): android.app.ServiceConnectionLeaked: Activity com.lablabla.similarsearch.WebViewActivity has leaked ServiceConnection [email protected] that was originally bound here 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:974) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:868) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ContextImpl.bindServiceAsUser(ContextImpl.java:1452) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ContextImpl.bindService(ContextImpl.java:1440) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.content.ContextWrapper.bindService(ContextWrapper.java:496) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.speech.tts.TextToSpeech.connectToEngine(TextToSpeech.java:685) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.speech.tts.TextToSpeech.initTts(TextToSpeech.java:655) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:608) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.webkit.AccessibilityInjector$TextToSpeechWrapper.<init>(AccessibilityInjector.java:682) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.webkit.AccessibilityInjector.addTtsApis(AccessibilityInjector.java:483) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.webkit.AccessibilityInjector.addAccessibilityApisIfNecessary(AccessibilityInjector.java:168) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.webkit.AccessibilityInjector.updateJavaScriptEnabled(AccessibilityInjector.java:418) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.webkit.WebViewClassic.updateJavaScriptEnabled(WebViewClassic.java:1682) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.webkit.WebSettingsClassic.setJavaScriptEnabled(WebSettingsClassic.java:1125) 
08-04 03:47:19.321: E/ActivityThread(24755): at com.lablabla.similarsearch.WebViewActivity.onCreate(WebViewActivity.java:24) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.Activity.performCreate(Activity.java:5133) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.os.Looper.loop(Looper.java:137) 
08-04 03:47:19.321: E/ActivityThread(24755): at android.app.ActivityThread.main(ActivityThread.java:5103) 
08-04 03:47:19.321: E/ActivityThread(24755): at java.lang.reflect.Method.invokeNative(Native Method) 
08-04 03:47:19.321: E/ActivityThread(24755): at java.lang.reflect.Method.invoke(Method.java:525) 
08-04 03:47:19.321: E/ActivityThread(24755): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
08-04 03:47:19.321: E/ActivityThread(24755): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-04 03:47:19.321: E/ActivityThread(24755): at dalvik.system.NativeStart.main(Native Method) 

Ed ecco il codice per l'attività: (Tutto ciò che fa è ottenere un URL dal Intent e caricarlo a un WebView)

public class WebViewActivity extends Activity { 

    public static final String EXTRA_URL = "extra_url"; 

    private WebView webView; 
    private String baseUrl; 

    @SuppressLint("SetJavaScriptEnabled") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.webview); 
     webView = (WebView) findViewById(R.id.webView); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.setWebViewClient(new WebViewClient()); 
     webView.getSettings().setUserAgentString(
      "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/20 Safari/537.31"); 
     baseUrl = getIntent().getStringExtra(EXTRA_URL); 
     webView.loadUrl(baseUrl); 
    } 
} 
+0

Hai mai capito cosa fosse? Sto vedendo la stessa cosa mentre collaudo la mia app con TalkBack. Quando premo il pulsante Indietro per uscire da una delle mie attività, TalkBack rilascia gli stessi errori. La mia attività ha anche una visualizzazione Web con javascript. La mia attività NON utilizza attivamente il servizio TTS. Sto solo testando come funziona con TalkBack. Ho trovato una discussione su Google Gruppi che tratta lo stesso problema ma a quanto pare si è risolto magicamente da solo. https://groups.google.com/forum/#!topic/eyes-free/b_3OJI8h4tQ –

+0

Non l'ho fatto. Non sembra influire sull'app stessa, non trovo alcuna indicazione che possa causare problemi con altre app o servizi che influenzano le normali funzioni del telefono. Ho appena iniziato una taglia su questo, forse sarà risolto in questo modo. –

risposta

13

Continuo a ricevere questo incidente nel mio logcat , ma la cosa strana è che la mia app non ha nulla a che fare con la cosa Text To Speech. non solo questa attività , la mia intera app non la usa affatto.

L'app in effetti non ha nulla a che fare con questo.

Tranne che quando si chiama:

webView.getSettings().setJavaScriptEnabled(true); 

il metodo WebViewClassic.updateJavaScriptEnabled (boolean) viene eseguito:

void updateJavaScriptEnabled(boolean enabled) { 
    if (isAccessibilityInjectionEnabled()) { 

==>>>> // Call placed to AccessibilityInjector.updateJavaScriptEnabled(boolean) 
     getAccessibilityInjector().updateJavaScriptEnabled(enabled); 
    } 
} 

Qui, isAccessibilityInjectionEnabled() rendimenti true nel caso del dispositivo. Recupera un elenco di servizi di accessibilità attualmente abilitati e fornisce/supporta AccessibilityServiceInfo.FEEDBACK_SPOKEN. Se questo elenco non è vuoto, viene restituito true.

Spostare lo stacktrace:

android.webkit.AccessibilityInjector.addTtsApis()

alla fine crea un oggetto TextToSpeech.

Il problema: TextToSpeech.connectToEngine() utilizza Context per chiamare bindService(). Il contesto è il contesto della tua attività (trasmesso da WebView). Credo che il Logcat mostra questo (o qualcosa di simile), quando viene avviato WebViewActivity:

con successo legato a com.google.android.tts

Ipotesi: Quando la vostra attività è distrutto e ricreato in rotazione dello schermo , il servizio TTS è ancora associato mentre il contesto non è più valido. Questo è ciò a cui fa riferimento l'eccezione.

Ho provato quanto segue per verificare la mia ipotesi:

Invece di definire WebView in xml, ho creato in modo dinamico in onCreate():

webView = new WebView(getApplicationContext()); 

Si noti che ho usato rapida dell'applicazione al posto di Attività (questo). Il contesto rimane valido per il cambiamento di orientamento e quindi l'eccezione non viene generata.

Per confermare che uno (o più) Accessibilità servizio è abilitato, aggiungere questo codice onCreate della vostra attività():

AccessibilityManager am = (AccessibilityManager) 
            getSystemService(ACCESSIBILITY_SERVICE); 

List<AccessibilityServiceInfo> listOfServices = 
           am.getEnabledAccessibilityServiceList(
            AccessibilityServiceInfo.FEEDBACK_ALL_MASK); 

for (AccessibilityServiceInfo asi : listOfServices) { 
    Log.i("", "Accessibility Service >>>>>>>>: " + asi.getSettingsActivityName()); 
Log.i("", "Accessibility Service >>>>>>>>: " + 
           asi.loadDescription(getPackageManager())); 

} 

Nota: ho dovuto accendere TalkBack (in Impostazioni> Accessibilità) per replicare il problema. Inoltre, non sono sicuro del motivo per cui questa eccezione non viene generata dopo l'interruzione forzata dell'applicazione.

In base all'utente Commento di Robert Nekic: comportamento in stampa indietro: l'eccezione viene generata quando viene utilizzato il contesto dell'attività. Il contesto dell'applicazione funziona ancora.

Informazioni utili: Link.

+0

Viene visualizzato l'errore logcat per AccessibilityInjector quando Talkback è attivo per Android 4.4. Puoi suggerire una soluzione alternativa per il problema qui: http://stackoverflow.com/q/29434063/1263215 –

+0

webview = (WebView) findViewById (R.id.webview_wv); Ho trovato la webview trovando, quindi come posso evitare questa eccezione? – thecr0w

+1

@ thecr0w Ho trovato che usare il contesto 'Applicazione' era l'unico modo per aggirare questa eccezione. L'ovvio effetto collaterale è che non è possibile definire 'WebView' in xml. Dovrai crearlo in fase di runtime e aggiungerlo al tuo layout. Una cosa che potresti provare: definire il tuo 'WebView' in xml e gonfiare quel layout usando' LayoutInflater' ottenuto tramite 'LayoutInflater.fromContext (getApplicationContext())'. Non posso dire se funzionerà. – Vikram

2

È possibile aggiungere questo frammento di codice per evitare questa connessione del servizio eccezione trapelato:

class YourActivity extends Activity { 
WebView yourWebView; 

    @Override 
    public void onDestroy() { 

     if (yourWebView != null) { 
      yourWebView.getSettings().setJavaScriptEnabled(false); 
     } 
} 

yourWebView.getSettings() setJavaScriptEnabled (false);. attiverà la chiamata di AccessibilityInjector. updateJavaScriptEnabled() in cui:

private void removeTtsApis() { 
    if (mTextToSpeech != null) { 
     mTextToSpeech.stop(); 
     mTextToSpeech.shutdown(); 
     mTextToSpeech = null; 
    } 

    mWebView.removeJavascriptInterface(ALIAS_TTS_JS_INTERFACE); 
} 

mTextToSpeech.shutdown() è solo il punto chiave.

Problemi correlati