8

私は本当に奇妙な問題を抱えています。

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

2 に答える 2

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現在有効になっている Accessibility Services と provide/support のリストを取得しますAccessibilityServiceInfo.FEEDBACK_SPOKEN。このリストが空でない場合、trueが返されます。

スタックトレースを上に移動:

android.webkit.AccessibilityInjector.addTtsApis()

最終的にTextToSpeechオブジェクトを作成します。

問題: TextToSpeech.connectToEngine()Context を使用して bindService() を呼び出します。コンテキストはアクティビティのコンテキストです (WebView から渡されます)。LogcatWebViewActivityが開始されたときに、これ (または同様のもの) が表示されると思います。

com.google.android.tts に正常にバインドされました

仮説: アクティビティが破棄され、画面の回転時に再作成される場合、TTS サービスは引き続きバインドされますが、コンテキストは無効になります。これは、例外が参照するものです。

仮説を検証するために、次のことを試しました。

xml で WebView を定義する代わりに、onCreate() で動的に作成しました。

webView = new WebView(getApplicationContext());

アクティビティ (this) の代わりにアプリケーションのコンテキストを使用したことに注意してください。向きが変わってもコンテキストは有効なままであるため、例外はスローされません。

1 つ (または複数) のアクセシビリティ サービスが有効になっていることを確認するには、次のコードをアクティビティの 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注:問題を再現するには、([設定] > [アクセシビリティ] の下で)オンにする必要がありました。また、アプリケーションを強制停止した後にこの例外がスローされない理由もわかりません。

ユーザー Robert Nekic のコメントに基づく: バック プレスの動作: アクティビティのコンテキストが使用されると例外がスローされます。アプリケーションのコンテキストは引き続き機能します。

役立つ情報:リンク.

于 2013-09-14T04:29:51.243 に答える
1

このコード スニペットを追加して、このサービス接続リーク例外を回避できます。

class YourActivity extends Activity {
WebView yourWebView;

    @Override
    public void onDestroy() {

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

yourWebView.getSettings().setJavaScriptEnabled(false); AccessibilityInjector の呼び出しをトリガーします。updateJavaScriptEnabled () で:

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

    mWebView.removeJavascriptInterface(ALIAS_TTS_JS_INTERFACE);
}

mTextToSpeech.shutdown() は重要なポイントです。

于 2014-11-23T10:11:24.610 に答える