10

J'espère trouver de l'aide ici car je ne suis pas familier avec BroadcastReceivers dans Android. Ce morceau de code ouvre un WebView vous rediriger vers une page de connexion et reçoit le jeton de connexion une fois qu'un changement d'URL est détecté. Après cela, l'activité est fermée.Une activité a fui IntentReceiver - LollipopBrowserAccessibilityManager

@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())); 
    } 


} 

Rien ne se passe et LogCat affiche cette erreur:

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) 

Mon problème est que je ne sais pas quelle BroadcastReceiver je dois désenregistrer depuis que je ne l'avais pas créé et initialisé un.

Merci pour votre aide

+0

Je ne suis pas sûr de ce qui ne va pas, l'erreur vient soudainement de l'activité que je n » t navigué vers. – neobie

+0

Votre appareil de test était-il sous Android O? –

+0

No Android 6.0 @Abir Hasan –

Répondre

1

Ce problème se produit lorsque destroy() est appelé sur le WebView lorsque le WebView est toujours attaché à la vue parente.

Le plantage peut être résolu en supprimant d'abord le Webview de sa vue parente avant d'appeler le destroy().

Notez que même si vous n'appelez pas manuellement destroy() (comme c'était le cas pour moi), ce crash peut toujours se produire. J'ai trouvé que la clé est que vous devez détruire explicitement un WebView (au moins dans un fragment), comme Android ne gère pas cela pour vous, et avant de le faire, vous devez le supprimer de sa vue parente.

Par exemple, si vous avez un fragment 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; 
     } 
    } 

Crédit complet à Billy Brawner: https://brawner.tech/2017/12/03/webview-memory-leak/

-2

Vous utilisez l'un des WebSettings suivants?

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

Je trouve que par la désactivation de ces options, (je ne l'ai pas vraiment besoin dans mon exemple), l'erreur a disparu. Je suppose qu'il a quelque chose à voir avec une bibliothèque de compatibilité nécessaire pour l'un d'entre eux.

+0

Non, je n'utilise pas l'un de ces derniers, mais je vais encore essayer de les désactiver –