Bonjour à tous !
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
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 ) :
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 !
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
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 !