Подтвердить что ты не робот

Активность просочилась IntentReceiver - LollipopBrowserAccessibilityManager

Я надеюсь найти здесь какую-то помощь, потому что я не знаком с BroadcastReceivers в Android. Этот фрагмент кода открывает WebView, перенаправляет вас на страницу входа и получает токен входа после обнаружения изменения URL. После этого активность закрывается.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    mLoginWebView = (WebView) findViewById(R.id.webview_login);

    redirectUrl = getString(R.string.app_redirect_url);


    //RECEIVE PLATFORM ID
    Bundle bundle = getIntent().getExtras();
    if(bundle != null){
        platform = bundle.getInt(ConstantsHelper.LOGIN_EXTRA_TOKEN);
    }

    mLoginWebView.setWebViewClient(new WebViewClient() {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            Log.d(TAG, "URL change to to " + url + " was detected");

            if (url.contains(redirectUrl) || url.contains("passport.twitch.tv")) {

                Log.d(TAG, "Login with platform " + platform);

                switch (platform){

                    //GET INSTAGRAM AUTH TOKEN
                    case ConstantsHelper.ID_INSTAGRAM:{
                        String accessToken = url.split("=")[1];

                        SharedPreferenceHelper.putString(ConstantsHelper.PREF_INST_ACCESS_TOKEN, accessToken);
                        NetworkManager.getInstance().catchTokens();

                    }

                    //GET TWITCH AUTH TOKEN
                    case ConstantsHelper.ID_TWITCH:{
                        String accessToken = url.substring(url.indexOf("=") + 1, url.indexOf("&"));

                        SharedPreferenceHelper.putString(ConstantsHelper.PREF_TWITCH_ACCESS_TOKEN, accessToken);
                        NetworkManager.getInstance().catchTokens();

                    }

                }
                finish(); //Activity is closed
                return true;
            }
            return false;
        }


    });

    switch (platform){
        case 1: mLoginWebView.loadUrl(NetworkManager.getInstance().getInstagramAuthUrl(getApplicationContext()));
        case 4: mLoginWebView.loadUrl(NetworkManager.getInstance().getTwitchAuthUrl(getApplicationContext()));
    }


}

Ничего не происходит, и LogCat отображает эту ошибку:

Activity com.maximutan.socialmedia_feed_merger.activities.LoginActivity has leaked IntentReceiver org.chromium.cont[email protected]25014a that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity com.maximutan.socialmedia_feed_merger.activities.LoginActivity has leaked IntentReceiver org.chromium.cont[email protected]25014a that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:962)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:763)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1179)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1159)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1153)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:554)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:554)
at org.chromium.content.browser.accessibility.LollipopBrowserAccessibilityManager.<init>(LollipopBrowserAccessibilityManager.java:3)
at org.chromium.content.browser.accessibility.BrowserAccessibilityManager.create(BrowserAccessibilityManager.java:2)
at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)

at org.chromium.base.SystemMessageHandler.handleMessage(
SystemMessageHandler.java:7)  
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5527)
,at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(
ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

Моя проблема в том, что я не знаю, какой BroadcastReceiver мне нужно отменить, поскольку я не создал и не инициализировал его.

Спасибо за помощь

4b9b3361

Ответ 1

Эта проблема возникает, когда destroy() вызывается в WebView, когда WebView все еще привязан к его родительскому представлению.

Сбой может быть разрешен, сначала удалив веб-представление из родительского представления перед вызовом destroy().

Обратите внимание, что даже если вы не вызываете destroy() вручную (как это было для меня), этот сбой все равно может произойти. Я обнаружил, что ключ заключается в том, что вы должны явно уничтожить WebView (по крайней мере, в фрагменте), поскольку Android не справляется с этим для вас, и до этого вам нужно удалить его из родительского представления.

Например, если у вас есть фрагмент WebView:

 @Override
    public void onDestroyView() {
        super.onDestroyView();

        // destroy the WebView completely
        if (mWebView != null) {
            // the WebView must be removed from the view hierarchy before calling destroy
            // to prevent a memory leak
            // See https://developer.android.com/reference/android/webkit/WebView.html#destroy%28%29
            ((ViewGroup) mWebView.getParent()).removeView(mWebView);
            mWebView.removeAllViews();
            mWebView.destroy();
            mWebView = null;
        }
    }

Полный кредит Билли Брауэру: https://brawner.tech/2017/12/03/webview-memory-leak/

Ответ 2

Используете ли вы один из следующих WebSettings?

    settings.setAllowContentAccess(true);
    settings.setAllowFileAccessFromFileURLs(true);
    settings.setAllowUniversalAccessFromFileURLs(true);
    settings.setAllowFileAccess(true);

Я обнаружил, что, отключив эти параметры (на самом деле я их не нуждался в моем экземпляре), ошибка исчезла. Я предполагаю, что это имеет какое-то отношение к библиотеке совместимости, необходимой для одного из них.