1479 sujets

Web Mobile et responsive web design

Bonjour à tous ! Smiley cligne

Je rencontre un problème de freeze de la page facebook lorsque l'on veut utiliser "facebook login" et que l'on se connecte à facebook Smiley sweatdrop

Comme le problème est assez compliqué à visualiser, j'ai directement fait une vidéo montrant le soucis :

https://www.youtube.com/watch?v=1rIqH2QBoXQ

Je vous poste directement le code qui normalement devrait fonctionner mais qui pour une raison inconnue ne fonctionne pas ( ou alors cela vient directement de Facebook ) :


package fr.donnemoifaim.donnemoifaim;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Bundle;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.*;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
import android.app.ProgressDialog;
import android.widget.Toast;

public class MainActivity extends Activity {

    protected WebView mainWebView;
    private ProgressBar mProgress;
    private Context mContext;
    private WebView mWebview;
    private WebView mWebviewPop;
    private FrameLayout mContainer;


    private String url = "https://donnemoifaim.fr/menu-gourmand.html";
    private String target_url_prefix = "donnemoifaim.fr";


    public void onBackPressed(){

        if (mainWebView.isFocused() && mainWebView.canGoBack()) {
            mainWebView.goBack();
        }
        else {
            super.onBackPressed();
            finish();
        }
    }

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

        //Get main webview
        mainWebView = (WebView) findViewById(R.id.mainWebView);

        //Progress Bar
        //mProgress = (ProgressBar) findViewById(R.id.progressBar);

        //Cookie manager for the webview
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);

        //Get outer container
        mContainer = (FrameLayout) findViewById(R.id.webview_frame);

        //Settings
        WebSettings webSettings = mainWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webSettings.setSupportMultipleWindows(true);
        webSettings.setGeolocationEnabled(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setDatabaseEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setGeolocationDatabasePath(this.getFilesDir().getPath());

        mainWebView.setWebViewClient(new MyCustomWebViewClient());
        mainWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            CookieManager.getInstance().setAcceptThirdPartyCookies(mainWebView, true);
        }

        mainWebView.setWebChromeClient(new UriWebChromeClient());
        mainWebView.loadUrl(url);

        mContext=this.getApplicationContext();

    }



    private class MyCustomWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            String host = Uri.parse(url).getHost();
            //Log.d("shouldOverrideUrlLoading", url);

            Toast.makeText(getApplicationContext(), host,
                    Toast.LENGTH_LONG).show();


            if( url.startsWith("http:") || url.startsWith("https:") ) {

                if(Uri.parse(url).getPath().equals("/connection-compte.html")) {
                    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://donnemoifaim.fr/connection-compte.html"));
                    startActivity(browserIntent);

                    return true ;
                }

                if (host.equals(target_url_prefix)) {
                    // This is my web site, so do not override; let my WebView load
                    // the page
                    if (mWebviewPop != null) {
                        mWebviewPop.setVisibility(View.GONE);
                        mContainer.removeView(mWebviewPop);
                        mWebviewPop = null;
                    }
                    return false;
                }
                if (host.equals("m.facebook.com") || host.equals("www.facebook.com") || host.equals("facebook.com")) {
                    return false;
                }
                // Otherwise, the link is not for a page on my site, so launch
                // another Activity that handles URLs
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity(intent);
                return true;
            }
            // Otherwise allow the OS to handle it
            else if (url.startsWith("tel:")) {
                Intent tel = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
                startActivity(tel);
                return true;
            }
            else if (url.startsWith("mailto:")) {
                Intent mail = new Intent(Intent.ACTION_SEND);
                mail.setType("application/octet-stream");
                String AdressMail = new String(url.replace("mailto:" , "")) ;
                mail.putExtra(Intent.EXTRA_EMAIL, new String[]{ AdressMail });
                mail.putExtra(Intent.EXTRA_SUBJECT, "");
                mail.putExtra(Intent.EXTRA_TEXT, "");
                startActivity(mail);
                return true;
            }
            return true;
        }


        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler,
                                       SslError error) {
            Log.d("onReceivedSslError", "onReceivedSslError");
            //super.onReceivedSslError(view, handler, error);
        }
    }



    private class UriWebChromeClient extends WebChromeClient {
        @Override
        public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
            callback.invoke(origin, true, false);
        }

        @Override
        public boolean onCreateWindow(WebView view, boolean isDialog,
                                      boolean isUserGesture, Message resultMsg) {
            mWebviewPop = new WebView(mContext);
            mWebviewPop.setVerticalScrollBarEnabled(false);
            mWebviewPop.setHorizontalScrollBarEnabled(false);
            mWebviewPop.setWebViewClient(new MyCustomWebViewClient());
            mWebviewPop.getSettings().setJavaScriptEnabled(true);
            mWebviewPop.getSettings().setSavePassword(false);
            mWebviewPop.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT));
            mContainer.addView(mWebviewPop);
            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
            transport.setWebView(mWebviewPop);
            resultMsg.sendToTarget();

            return true;
        }


        final ProgressBar Pbar = (ProgressBar) findViewById(R.id.pB1);

        public void onProgressChanged(WebView view, int progress)
        {
            if(progress < 100 && Pbar.getVisibility() == ProgressBar.GONE){
                Pbar.setVisibility(ProgressBar.VISIBLE);
            }
            Pbar.setProgress(progress);
            if(progress == 100) {
                Pbar.setVisibility(ProgressBar.GONE);
            }
        }

        @Override
        public void onCloseWindow(WebView window) {
            Log.d("onCloseWindow", "called");
        }

    }

}


Voici les infos que j'ai:

- facebook log doit etre ouvert dans une webview séparée de la principale,
- facebook, après connection, tente de redirigé vers une page spéciale,
- cette redirection entraînait un beug de page blanche si il n'y avait qu'une seul webview, d'ou la nécessité d'en créer 2,
- Moi ça coince ici, facebook freeze, alors qu'il devrait rediriger vers une autre page (peut-etre un conflit avec la commande en javascript window.close ?)
- Facebook fait en sorte qu'un cookie de connexion soit créé, ici il fait bien son boulot


Si vous avez déjà eu ce genre de problème, comment l'avez-vous solutionné ? Avez-vous abandonné pour vous tourner vers un log en natif facebook ?

Bref, je remercie déjà la communauté pour ses réponses qui, je l'espère, en aideront plus d'un ! Smiley biggrin
Salut,

J'ai visité le site. Je n'ai pas trouvé où cliquer pour faire apparaître l'écran de connexion FaceBook. Peux tu m'expliquer ? (Je n'ai pas installé l'appli -je suis sur Android 2.3-)

Tu nous dis "peut-etre un conflit avec la commande en javascript window.close ?" Si tu as bien ouvert la fenêtre avec un window.open je ne vois pas de quel conflit il s'agit.

Moi je paris que c'est un problème de redirection en boucle : Page blanche...
edit: Pour le vérifier il y à ERROR_REDIRECT_LOOP
Modifié par Safina (15 Oct 2015 - 14:46)
Salut Safina !

Tout d'abord merci de t"intéresser au problème Smiley smile

Je ne sais pas si tu as eu l'occasion de le voir mais j'ai expliqué mon problème en détail via une vidéo youtube : https://www.youtube.com/watch?v=1rIqH2QBoXQ

Pour expliquer comment la page facebook est ouverte, enfait lorsque tu te rends sur le site à l'adresse : https://donnemoifaim.fr/menu-gourmand.html ou l'application, certaine action nécessite un compte, par exemple aimer une image, accéder à une réduction, etc... Un bloc s'ouvre alors pour se connecter normalement ou via facebook.

Au niveau javascript ce n'est pas moi qui ouvre la fenêtre mais facebook lorsque l'on clique sur le bouton connexion facebook ! Je n'ai que très peu de contrôle dessus puisque le JS vient du SDK de facebook Smiley confus

J'explore le code que tu m'as fournis pour voir si la solution s'y trouve Smiley biggrin

J'attends de tes nouvelles Smiley smile