Faire en sorte que l'utilisation de Facebook fonctionne avec une vue Web Android

J'essaie simplement d'implémenter la connexion Facebook sur un WebView dans Android. Le problème est après avoir cliqué sur le bouton Facebook de ma page HTML et insérer le nom d'utilisateur et le mot de passe sur la boîte de dialogue de Facebook. La redirection url me donne une page noire.

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WebView webview = new WebView(this); webview.setWebChromeClient(new WebChromeClient()); webview.getSettings().setPluginState(PluginState.ON); webview.getSettings().setJavaScriptEnabled(true); webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); webview.setWebViewClient(new WebViewClient()); webview.loadUrl("http://peoplehunt.crowdscanner.com/hunt"); setContentView(webview); 

Ceci est l'API javascript régulière de Facebook sur ma page HTML et cette fonction est appelée lorsque le bouton Facebook est cliqué.

  • Une fois pour toutes, comment sauvegarder correctement l'état d'instance de Fragments dans la pile arrière?
  • SSLSocket via un autre SSLSocket
  • Quel devrait être le nom de package de l'application Android?
  • Comment amener une activité au premier plan (haut de la pile)?
  • Android - image locale dans le webview
  • Commentaires sur Android Layout xml
  •  $("#login_facebook").click(function() { FB.login(function(response) { //This function should be called if (response.authResponse) { FB.api('/me?fields=name,email,picture,id&type=large', function(response) { //console.log("email "+response.email); $("#submitHandle").hide(); $("#loader").show(); //console.log('Good to see you, ' + response.picture + '.'); var theUsername = response.name; theUsername = theUsername.replace(/ /g, '_')+"_"+response.id+"@meetforeal.com"; //console.log(theUsername); $("input[name=email]").val(encodeURIComponent(response.email)); $("input[name=lastName]").val(encodeURIComponent(response.name)); $("input[name=avatarImage]").val(response.picture); $("input[name=userName]").val(encodeURIComponent(theUsername)); $("#msg_twitter").fadeIn("slow"); $("#submitHandle").show(); $("#loader").hide(); $("#user").attr("action","/crowdmodule/auth/registerattendeefacebook"); $("#user").submit(); }); } else { //console.log('User cancelled login or did not fully authorize.'); } }, {scope: 'email'}); 

    TOUTES les idées sur la façon de récupérer la réponse après la redirection sur la page de dialogue Facebook? MERCI.

  • Android: Avoir une diapositive d'affichage arbitraire sous une autre vue comme le fait le clavier logiciel
  • Pourquoi est-ce que demandeIdToken est de retour nulle?
  • Détection de glissement pour chaque ligne de liste
  • Android - comment obtenir android.R.anim.slide_in_right
  • Existe-t-il une taille de bouton standard?
  • Les instructions du mode Immersif réapparaissent chaque fois que l'appareil entre dans ce mode
  • 6 Solutions collect form web for “Faire en sorte que l'utilisation de Facebook fonctionne avec une vue Web Android”

    J'ai eu le même problème sur mon application Android. La cause du problème est la connexion de FB javascript ouvre une nouvelle page sur une nouvelle fenêtre. Ensuite, il tente de le fermer après le succès de la connexion. Veuillez suivre l'exemple de mes codes de travail.

     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0099cc" tools:context=".MyActivity" android:id="@+id/webview_frame"> <WebView android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> 

    La visualisation Web de "webview" id est la vue principale de mon contenu. Voici mes codes d'activité.

     public class MyActivity extends Activity { /* URL saved to be loaded after fb login */ private static final String target_url="http://www.example.com"; private static final String target_url_prefix="www.example.com"; private Context mContext; private WebView mWebview; private WebView mWebviewPop; private FrameLayout mContainer; private long mLastBackPressTime = 0; private Toast mToast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_urimalo); // final View controlsView = // findViewById(R.id.fullscreen_content_controls); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); mWebview = (WebView) findViewById(R.id.webview); //mWebviewPop = (WebView) findViewById(R.id.webviewPop); mContainer = (FrameLayout) findViewById(R.id.webview_frame); WebSettings webSettings = mWebview.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setAppCacheEnabled(true); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setSupportMultipleWindows(true); mWebview.setWebViewClient(new UriWebViewClient()); mWebview.setWebChromeClient(new UriChromeClient()); mWebview.loadUrl(target_url); mContext=this.getApplicationContext(); } private class UriWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { String host = Uri.parse(url).getHost(); //Log.d("shouldOverrideUrlLoading", url); 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")) { 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; } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { Log.d("onReceivedSslError", "onReceivedSslError"); //super.onReceivedSslError(view, handler, error); } } class UriChromeClient extends WebChromeClient { @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 UriWebViewClient()); 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; } @Override public void onCloseWindow(WebView window) { Log.d("onCloseWindow", "called"); } } } 

    La clé de ce problème concerne onCreateWindow. Une nouvelle fenêtre est créée et insérée dans la disposition des trames et supprimée lors de la réussite. J'ai ajouté le retrait à shouldOverrideUrlLoading.

    En ce qui concerne la meilleure réponse à cette question , il vous suffit d'implémenter la méthode OnPageFinished de la classe WebViewClient que vous utilisez.

     public void onPageFinished(WebView view, String url) { // First, get the URL that Facebook's login button is actually redirecting you to. // It should be something simulator to https://www.facebook.com/dialog/return/arbiter?relation=opener&close=true String webUrl = webView.getUrl(); // Pass it to the LogCat so that you can then use it in the if statement below. Log.d.println(TAG, webUrl); if (url.startsWith("The url that you copied from the LogCat")) { // Check whether the current URL is the URL that Facebook's redirecting you to. // If it is - that's it - do what you want to after the logging process has finished. return; } super.onPageFinished(view, url); } 

    Cela m'a bien fonctionné. J'espère que cela vous aide aussi 🙂

    Remplacer shouldOverrideUrlLoading() dans votre WebViewClient . Recherchez shouldOverrideUrlLoading ici . En outre, il existe un paramètre que vous pouvez passer à l'API de connexion de Facebook; Je pense que c'est redirect_uri. Cela devrait vous aider à reconnaître quand la connexion est réussie et dans votre shouldOVerrideUrlLoading() , vous devriez simplement détecter l'URL en cours de chargement et si c'est le redirect_uri que vous avez spécifié, alors il suffit de renvoyer la vraie dans cette méthode et de fermer la vision Web ou tout ce que vous voulez Souhaitez quand la connexion est réussie.

    La réponse ci-dessus est trop ancienne et ne fonctionne pas avec la dernière version de Facebook sdk 2.7. Après avoir passé 4 heures, j'ai découvert quelques changements. Le code suivant fonctionnera bien avec le dernier SDK.

    Ci-dessous mentionné est le fichier de mise en page XML.

     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0099cc" tools:context=".MainActivity" android:id="@+id/webview_frame"> <WebView android:id="@+id/webView" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </FrameLayout> 

    Il s'agit de l'extrait de code Activité Android

      public class MainActivity extends AppCompatActivity { private WebView webView; private WebView mWebviewPop; private FrameLayout mContainer; private Context mContext; private String url = "https://www.YourWebsiteAddress.com"; private String target_url_prefix = "www.YourWebsiteAddress.com"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Get outer container mContainer = (FrameLayout) findViewById(R.id.webview_frame); webView = (WebView)findViewById(R.id.webView); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setAppCacheEnabled(true); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setSupportMultipleWindows(true); //These two lines are specific for my need. These are not necessary if (Build.VERSION.SDK_INT >= 21) { webSettings.setMixedContentMode( WebSettings.MIXED_CONTENT_ALWAYS_ALLOW ); } //Cookie manager for the webview CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); webView.setWebViewClient(new MyCustomWebViewClient()); webView.setWebChromeClient(new UriWebChromeClient()); webView.loadUrl("https://www.YourWebsiteAddress.com"); mContext=this.getApplicationContext(); } @Override public void onBackPressed() { if(webView.isFocused() && webView.canGoBack()) { webView.goBack(); } else { super.onBackPressed(); } } private class MyCustomWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { String host = Uri.parse(url).getHost(); 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://www.YourWebsiteAddress.com")); startActivity(browserIntent); return true ; } if (host.equals(target_url_prefix)) { 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; } //This is again specific for my website 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); } @Override public void onPageFinished(WebView view, String url) { if(url.startsWith("https://m.facebook.com/v2.7/dialog/oauth")){ if(mWebviewPop!=null) { mWebviewPop.setVisibility(View.GONE); mContainer.removeView(mWebviewPop); mWebviewPop=null; } view.loadUrl("https://www.YourWebsiteAddress.com"); return; } super.onPageFinished(view, url); } } private class UriWebChromeClient extends WebChromeClient { @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; } @Override public void onCloseWindow(WebView window) { Log.d("onCloseWindow", "called"); } } } 

    Essayez de déplacer votre visionnage Web vers le fichier de mise en page xml. L'erreur de la page blanche a été causée en raison de l'échec du script js lors de la redirection de la page de connexion oAuth à la page d'acceptation d'autorisation. Vous pouvez résoudre ce problème en déplaçant votre visionneuse Web dans la mise en page xml.

    Ma réponse est essentiellement similaire à celle d'autres ici, car je crée une deuxième WebView pour héberger la page de connexion Facebook, plutôt que de tenter de résoudre le problème avec les redirections. Cependant, j'ai choisi de placer le WebView connexion dans son propre Fragment et de lui donner ses propres sous-classes spécifiques WebViewClient et WebChromeClient . Je pense que cela rend un peu plus facile de voir quel rôle chaque composant joue, et quels objets ont besoin des paramètres et des comportements.

    J'utilise également WebChromeClient.onCloseWindow() pour détecter quand le JavaScript de Facebook veut fermer la fenêtre de connexion. C'est beaucoup plus robuste que l'approche que j'ai initialement poursuivie, à partir d'une réponse différente.

    Dans votre mise en page Activity , vous aurez la WebView "primaire", qui héberge les commentaires et un conteneur pour FacebookWebLoginFragment . Le Fragment connexion est créé à la volée, lorsqu'il est nécessaire, puis supprimé lorsque le login JavaScript de Facebook demande que sa fenêtre soit fermée.

    Activity structure de Mes Activity se présente comme suit:

     <include layout="@layout/toolbar_common" /> <FrameLayout android:id="@+id/main_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/web_view_fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" android:overScrollMode="never" /> <!-- Used for Facebook login associated with comments --> <FrameLayout android:id="@+id/facebook_web_login_fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" android:overScrollMode="never" android:visibility="gone" /> </FrameLayout> 

    Dans votre Activity , vous aurez besoin d'un code pour afficher et masquer le fragment de connexion Web de Facebook. J'utilise le bus d'événement Otto, donc j'ai des gestionnaires d'événements comme ceux ci-dessous. (Rien ici n'est spécifique à ce problème, j'inclus ce code juste pour vous donner une idée de la façon dont le Fragment connexion s'inscrit dans la structure globale.)

     @Subscribe public void onShowFacebookWebLoginEvent(ShowFacebookWebLoginEvent event) { FacebookWebLoginFragment existingFragment = getFacebookWebLoginFragment(); if (existingFragment == null) { mFacebookWebLoginFragmentContainer.setVisibility(View.VISIBLE); createFacebookWebLoginFragment(event); } } @Subscribe public void onHideFacebookWebLoginEvent(HideFacebookWebLoginEvent event) { FacebookWebLoginFragment existingFragment = getFacebookWebLoginFragment(); if (existingFragment != null) { mFacebookWebLoginFragmentContainer.setVisibility(View.GONE); FragmentManager fm = getSupportFragmentManager(); fm.beginTransaction() .remove(existingFragment) .commit(); } } @Nullable private FacebookWebLoginFragment getFacebookWebLoginFragment() { FragmentManager fm = getSupportFragmentManager(); return (FacebookWebLoginFragment) fm.findFragmentById(R.id.facebook_web_login_fragment_container); } private void createFacebookWebLoginFragment(ShowFacebookWebLoginEvent event) { FragmentManager fm = getSupportFragmentManager(); FacebookWebLoginFragment fragment = (FacebookWebLoginFragment) fm.findFragmentById(R.id.facebook_web_login_fragment_container); if (fragment == null) { fragment = FacebookWebLoginFragment.newInstance(event.getOnCreateWindowResultMessage()); fm.beginTransaction() .add(R.id.facebook_web_login_fragment_container, fragment) .commit(); } } 

    Alors que le FacebookWebLoginFragment existe, il devrait être autorisé à gérer les pressions de l'arrière-plan du périphérique. Ceci est important car le flux de connexion de Facebook inclut la possibilité de naviguer à l'écart de la page de connexion, et l'utilisateur s'attend à ce que le bouton de retour les renvoie pour se connecter. Donc, dans mon Activity , j'ai ceci:

     @Override public void onBackPressed() { boolean handled = false; FacebookWebLoginFragment facebookWebLoginFragment = getFacebookWebLoginFragment(); if (facebookWebLoginFragment != null) { handled = facebookWebLoginFragment.onBackPressed(); } if (!handled) { WebViewFragment fragment = getWebViewFragment(); if (fragment != null) { handled = fragment.onBackPressed(); } } if (!handled) { finish(); } } 

    La mise en page de FacebookWebLoginFragment est extrêmement simple:

     <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> 

    Voici le code FacebookWebLoginFragment . Notez qu'il repose sur une sous-classe de WebChromeClient pour détecter lorsque le JavaScript de connexion Facebook est prêt à fermer la fenêtre (c.-à-d. Supprimer le fragment). Notez également qu'il n'y a pas de communication directe entre ce WebView connexion et le WebView principal, qui contient les commentaires UI; Le jeton d'authentification est transmis via un cookie de tierce partie, c'est pourquoi vous devez être sûr d'activer le support de cookie tiers sur votre WebView principal.

     import android.graphics.Bitmap; import android.net.Uri; import android.net.http.SslError; import android.os.Bundle; import android.os.Message; import android.support.annotation.Nullable; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.SslErrorHandler; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; import butterknife.Bind; import butterknife.ButterKnife; /** * Hosts WebView used by Facebook web login. */ public class FacebookWebLoginFragment extends BaseFragment { private static final String LOGTAG = LogHelper.getLogTag(FacebookWebLoginFragment.class); @Bind(R.id.web_view) WebView mFacebookLoginWebView; private WebChromeClient mFacebookLoginWebChromeClient; private Message onCreateWindowResultMessage; public static FacebookWebLoginFragment newInstance(Message onCreateWindowResultMessage) { FacebookWebLoginFragment fragment = new FacebookWebLoginFragment(); fragment.onCreateWindowResultMessage = onCreateWindowResultMessage; return fragment; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.frag_facebook_web_login, container, false); ButterKnife.bind(this, rootView); return rootView; } @Override public void onViewCreated(View v, @Nullable Bundle savedInstanceState) { super.onViewCreated(v, savedInstanceState); mFacebookLoginWebView.setVerticalScrollBarEnabled(false); mFacebookLoginWebView.setHorizontalScrollBarEnabled(false); mFacebookLoginWebView.setWebViewClient(new FacebookLoginWebViewClient()); mFacebookLoginWebView.getSettings().setJavaScriptEnabled(true); mFacebookLoginWebView.getSettings().setSavePassword(false); mFacebookLoginWebView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mFacebookLoginWebChromeClient = makeFacebookLoginWebChromeClient(); mFacebookLoginWebView.setWebChromeClient(mFacebookLoginWebChromeClient); WebView.WebViewTransport transport = (WebView.WebViewTransport) onCreateWindowResultMessage.obj; transport.setWebView(mFacebookLoginWebView); onCreateWindowResultMessage.sendToTarget(); onCreateWindowResultMessage = null; // This seems to eliminate a mysterious crash } @Override public void onDestroy() { mFacebookLoginWebChromeClient = null; super.onDestroy(); } /** * Performs fragment-specific behavior for back button, and returns true if the back press * has been fully handled. */ public boolean onBackPressed() { if (mFacebookLoginWebView.canGoBack()) { mFacebookLoginWebView.goBack(); } else { closeThisFragment(); } return true; } private void closeThisFragment() { EventBusHelper.post(new HideFacebookWebLoginEvent()); } class FacebookLoginWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // Only allow content from Facebook Uri uri = Uri.parse(url); String scheme = uri.getScheme(); if (scheme != null && (TextUtils.equals(scheme, "http") || TextUtils.equals(scheme, "https"))) { if (UriHelper.isFacebookHost(uri)) { return false; } } return true; } } private WebChromeClient makeFacebookLoginWebChromeClient() { return new WebChromeClient() { @Override public void onCloseWindow(WebView window) { closeThisFragment(); } }; } } 

    Maintenant, le bit le plus difficile est de faire les changements nécessaires à votre WebView existant, car il est probable que vous avez déjà une bonne quantité de code, et vous aurez besoin de comprendre ce qu'il faut changer.

    Tout d'abord, assurez-vous d'avoir activé JavaScript, et qu'il supporte plusieurs fenêtres.

     WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setSupportMultipleWindows(true); 

    Vous n'avez pas besoin d'appeler setJavaScriptCanOpenWindowsAutomatically(true) .

    En regardant certaines des autres réponses, vous pourriez penser que vous avez besoin de monkey avec WebViewClient qui est affecté à votre WebView et shouldOverrideUrlLoading() . Ceci n'est pas nécessaire. Ce qui importe, c'est le WebChromeClient , qui doit annuler onCreateWindow() .

    Donc … ensuite, affectez une sous-classe WebChromeClient personnalisée à votre WebView :

     mWebView.setWebChromeClient(new WebChromeClient() { @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { String url = null; Message href = view.getHandler().obtainMessage(); if (href != null) { view.requestFocusNodeHref(href); url = href.getData().getString("url"); } LogHelper.d(LOGTAG, "onCreateWindow: " + url); // Unfortunately, url is null when "Log In to Post" button is pressed if (url == null || UriHelper.isFacebookHost(Uri.parse(url))) { // Facebook login requires cookies to be enabled, and on more recent versions // of Android, it's also necessary to enable acceptance of 3rd-party cookies // on the WebView that hosts Facebook comments CookieHelper.setAcceptThirdPartyCookies(mWebView, true); EventBusHelper.post(new ShowFacebookWebLoginEvent(resultMsg)); } else { LogHelper.d(LOGTAG, "Ignoring request from js to open new window for URL: " + url); } return true; } }); 

    Vous remarquerez que c'est le deuxième appel à UriHelper.isFacebookHost() . Je n'ai pas d'approche anti-balles pour déterminer cela, mais voici ce que je fais:

     public static boolean isFacebookHost(Uri uri) { if (uri != null && !TextUtils.isEmpty(uri.getHost())) { String host = uri.getHost().toLowerCase(); return host.endsWith("facebook.com") || host.endsWith("facebook.net"); } return false; } 

    Vous remarquerez également l'appel à CookieHelper.setAcceptThirdPartyCookies() . Voici le code pour cela:

     public static void setAcceptThirdPartyCookies(WebView webView, boolean accept) { CookieManager cookieManager = CookieManager.getInstance(); // This is a safeguard, in case you've disabled cookies elsewhere if (accept && !cookieManager.acceptCookie()) { cookieManager.setAcceptCookie(true); } if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { cookieManager.setAcceptThirdPartyCookies(webView, accept); } } 

    Une autre chose qui déplace certaines personnes est la configuration de "URIs de redirection OAuth valide" dans les paramètres Facebook dev. Si vous voyez une erreur comme celle-ci dans vos journaux:

    URL bloqué: cette redirection a échoué car l'URI de redirection n'a pas de liste blanche dans les Paramètres client OAuth de l'application. Assurez-vous que la connexion Client et Web OAuth est activée et ajoutez tous vos domaines d'application comme URI valides OAuth Redirect.

    … alors vous voudrez vérifier cette réponse: https://stackoverflow.com/a/37009374

    S'amuser! Une solution compliquée à ce qui semble être un problème très simple. Du côté positif, Android a donné aux développeurs une tonne de contrôle ici.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.