我有一个非常奇怪的问题。
我一直在我的logcat中遇到这个崩溃,但奇怪的是我的应用程序与Text To Speech
无关。不只是这个活动,我的整个应用程序根本不使用它。
08-04 03:47:19.321: E/ActivityThread(24755): Activity com.lablabla.similarsearch.WebViewActivity has leaked ServiceConnection android.speech.tts.TextToSpeech$Connection@443065c0 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 android.speech.tts.TextToSpeech$Connection@443065c0 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)
以下是该活动的代码:(所有功能都是从Intent
获取网址并将其加载到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 :(得分:13)
我一直在我的logcat中遇到这个崩溃,但奇怪的是这是我的 应用程序与Text To Speech事物无关。不只是这个 活动,我的整个应用程序根本不使用它。
你的应用确实与它无关。
除非您致电:
webView.getSettings().setJavaScriptEnabled(true);
执行WebViewClassic.updateJavaScriptEnabled(boolean)方法:
void updateJavaScriptEnabled(boolean enabled) {
if (isAccessibilityInjectionEnabled()) {
==>>>> // Call placed to AccessibilityInjector.updateJavaScriptEnabled(boolean)
getAccessibilityInjector().updateJavaScriptEnabled(enabled);
}
}
此处,isAccessibilityInjectionEnabled()
会在您的设备中返回true
。它检索当前启用的辅助功能服务列表,并提供/支持AccessibilityServiceInfo.FEEDBACK_SPOKEN
。如果此列表非空,则返回true
。
向上移动堆栈跟踪:
android.webkit.AccessibilityInjector.addTtsApis()
最终创建一个TextToSpeech
对象。
问题:TextToSpeech.connectToEngine()
使用Context来调用bindService()。上下文是您的Activity的上下文(从WebView传递)。我相信当WebViewActivity
启动时,Logcat会显示这个(或类似的东西):
成功绑定到com.google.android.tts
假设:当您的活动在屏幕旋转时被销毁并重新创建时,TTS服务仍然在上下文无效时被绑定。这就是例外所指的内容。
我尝试以下方法来测试我的假设:
我没有在xml中定义WebView,而是在onCreate()中动态创建它:
webView = new WebView(getApplicationContext());
请注意,我使用Application的上下文代替Activity(this)。上下文在方向更改时保持有效,因此不会抛出异常。
要确认已启用一个(或多个)辅助功能服务,请将此代码添加到您的活动的onCreate()中:
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()));
}
注意:我必须打开TalkBack
(在设置&gt;辅助功能下)才能复制此问题。此外,我不确定为什么在强制停止应用程序后不会抛出此异常。
基于用户Robert Nekic的评论:背面的行为:当使用活动的上下文时抛出异常。应用程序的上下文仍然有效。
有用信息:Link。
答案 1 :(得分:1)
您可以添加此代码段以避免此服务连接泄露异常:
class YourActivity extends Activity {
WebView yourWebView;
@Override
public void onDestroy() {
if (yourWebView != null) {
yourWebView.getSettings().setJavaScriptEnabled(false);
}
}
yourWebView.getSettings()setJavaScriptEnabled(假)。将触发AccessibilityInjector的调用。updateJavaScriptEnabled() 其中:
private void removeTtsApis() {
if (mTextToSpeech != null) {
mTextToSpeech.stop();
mTextToSpeech.shutdown();
mTextToSpeech = null;
}
mWebView.removeJavascriptInterface(ALIAS_TTS_JS_INTERFACE);
}
mTextToSpeech.shutdown()只是关键点。