Facebook connect / webview android ne fonctionne pas

donnemoifaim Messages postés 11 Statut Membre -  
donnemoifaim Messages postés 11 Statut Membre -
Bonsoir !

J'ai créé l'application DonneMoiFaim sur android hier, j'ai utilisé une webview puisque le site est déjà adapté sur mobile. :)

La navigation était parfaite, jusqu'à ce que j'essais de me connecter sur Facebook via le connect button intégré sur mon site Smiley decu

La connexion est bien apparue me demandant mes identifiants, mais une fois la connexion validée, au lieu de retourner sur la view de l'app, je tombe sur une page blanche..

Alors oui j'ai fais mes recherches, mais je n'arrive pas implémenter les réponses qui sont parfois très hasardeuses ou bien qui n'expliquent rien (je suis NOVICE en android, je l'ai bouquiné hier pour la première fois de ma vie ! J'ai besoin de comprendre ce que je fais un minimum pour bien avancer ^^)

Voici mon code actuel :

package fr.donnemoifaim.donnemoifaim;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends ActionBarActivity {

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
android.webkit.WebView myWebView = (android.webkit.WebView) findViewById(R.id.webview);

getSupportActionBar().hide();

myWebView.setWebViewClient(new android.webkit.WebViewClient());
android.webkit.WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(true);

myWebView.loadUrl("https://donnemoifaim.fr");

// Autoriser ou non la géocalisation
myWebView.setWebChromeClient(new android.webkit.WebChromeClient() {
public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) {
// callback.invoke(String origin, boolean allow, boolean remember);
callback.invoke(origin, true, false);
}
});

myWebView.getSettings().setAppCacheEnabled(true);
myWebView.getSettings().setDatabaseEnabled(true);
myWebView.getSettings().setDomStorageEnabled(true);

return true;
}
}


J'espère que quelqu'un est calé coté Android et passera par là :')

Bonne soirée et merci à tous :)) !!

6 réponses

  1. BunoCS Messages postés 15922 Date d'inscription   Statut Modérateur Dernière intervention   3 931
     
    Hello,

    Je n'aime pas trop utiliser les webviews dans mes applis. Après quelques recherches (voir ici par exemble), il semblerait qu'il faille surchargé la méthode
    onCreateWindows
    du
    WebChromeClient
    . Un exemple de code ici: https://pastebin.com/KdzfhqDJ

    En passant, l'initialisation de ta webview doit se faire dans le
    onCreate
    et non dans le
    onCreateOptionsMenu
    .

    @+
    Buno, Modo CS-CCM
    L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
    The urgent is done, the impossible is underway. For miracles, provide for a delay...
    1
    1. donnemoifaim
       
      Ok je vais me pencher sur tout ca, merci ! Et bien figure toi que je pense que que la webview lorsque l on a un site responsiv est le mieux pour plusieurs raisons :

      - pas besoin de refaire tout le site, surtout que sur Android je suis debutant,
      - pas besoin non plus de faire des mises a jour de l appli pour tout et n imp, les mises a jour sont automatiques, on se concentre uniquement sur son site web
      - point non essentiel mais non négligeable , le poid de ce genre d appli ne dépasse souvent pas les 2mo, ce qui est un plus lors du téléchargement

      En tout cas merci encore je continu mes recherches en prenant en compte les tiennes :)
      0
  2. donnemoifaim Messages postés 11 Statut Membre
     
    J'ai pas mal d'erreur , j'ai simplement copié-collé pour le tester. J'ai 4 erreurs :

    mainWebView = (WebView) findViewById(R.id.mainWebView);


    --> cannot resolve mainWebView

     mProgress = (ProgressBar) findViewById(R.id.progressBar);


    --> cannot resolve progressBar

    mContainer = (FrameLayout) findViewById(R.id.webview_frame);


    --> cannot resolve webview_frame

    getMenuInflater().inflate(R.menu.example_main, menu);


    --> cannot resolve example_main

    Me manque t'il des SDK nécessaire ? Le code est t'il faux, obselete ? Me manque t'il des déclarations (que ce soit dans le layout, le manifeste ou autre ? )

    Voici le code complet de l'url que tu m'as fourni :

    package fr.donnemoifaim.donnemoifaim;

    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.Message;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.view.ViewGroup;
    import android.webkit.*;
    import android.widget.FrameLayout;
    import android.widget.ProgressBar;

    public class ExampleMainActivity extends Activity {

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

    private String url = "http://stage.example.com";
    private String target_url_prefix = "stage.example.com";

    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);

    mainWebView.setWebViewClient(new MyCustomWebViewClient());
    mainWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);

    mainWebView.setWebChromeClient(new MyCustomChromeClient());
    mainWebView.loadUrl("http://stage.example.com/home");

    mContext=this.getApplicationContext();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.example_main, menu);
    return true;
    }

    private class MyCustomWebViewClient 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") || host.equals("www.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);
    }

    }

    private class MyCustomChromeClient 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");
    }

    }
    }


    Merci pour votre attention à tous !!
    0
    1. BunoCS Messages postés 15922 Date d'inscription   Statut Modérateur Dernière intervention   3 931
       
      Il faut l'adapter à ton code ;)

      La méthode
      findViewByID
      cherche, comme son nom l'indique, une correspondance entre un ID et une vue. Par exemple, dans ton code, ta webView est identifiée avec l'ID
      R.id.webview
      .
      Il faut également faire du ménage: si tu n'as pas de ProgressBar, de menu,...tu supprimes.
      0
  3. donnemoifaim Messages postés 11 Statut Membre
     
    Haha oui en effet ç'est tout bette, j'étais sur d'avoir fait quelque chose de mauvais que je n'ai pas pensé à supprimer les lignes :p !

    Bon du coup aucune erreur mais quand je lance l'appli : l'application 'donnemoifaim' s'est arrête..

    Alors là trou noir..

    On récapitule :

    ------------------------

    MainActivity.java :

    package fr.donnemoifaim.donnemoifaim;

    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.Message;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    import android.webkit.*;
    import android.webkit.WebChromeClient;
    import android.widget.FrameLayout;
    import android.widget.ProgressBar;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;

    public class MainActivity extends Activity {

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

    private String url = "https://donnemoifaim.fr";
    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);

    //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);

    mainWebView.setWebViewClient(new MyCustomWebViewClient());
    mainWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);

    mainWebView.setWebChromeClient(new MyCustomChromeClient());
    mainWebView.loadUrl("https://donnemoifaim.fr");

    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);
    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"))
    {
    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);
    }

    }

    private class MyCustomChromeClient 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");
    }

    }
    }


    ---------------------------
    AndroidActivity.xml :

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


    ------------------------------
    menu_main.xml :

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" tools:context="MainActivity">
    </menu>


    values->strings.xml

    <code><resources>
    <string name="app_name">DonneMoiFaim</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    </resources>
    </code>

    ----------------------------
    values-> style.xml

    <resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    </style>

    </resources>


    Je pense qui y a des choses inutiles/flous, étant un parfait novice j'ai vraiment du mal à les identifier :S
    0
  4. BunoCS Messages postés 15922 Date d'inscription   Statut Modérateur Dernière intervention   3 931
     
    Quel est le message d'erreur dans les logs?

    Je vois ceci:
    setContentView(R.layout.activity_main);

    Or, tu dis avoir nommé ton fichier
    AndroidActivity.xml
    .
    Sachant qu'il n'est pas possible de mettre des majuscules dans les noms des ressources, il faut donc renommer ton fichier xml en activity_main.xml

    Vu que tu n'utilises pas le menu, tu peux supprimer menu_main.xml.

    Ensuite, comme je te l'ai dit, la méthode findViewByID() recherche la "vue" ou composant graphique ayant l'ID passé en paramètre. Dans ton xml, tu as une seule WebView mais tu ne la récupères pas dans ton onCreate()! Je parle de l'objet mainWebview qui n'est pas initialisé.
    Et il te manque dans ton layout un container nommé R.id.webview_frame. Mais à voir si tu en as vraiment besoin dans ton cas...

    @+
    Buno, Modo CS-CCM
    L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
    The urgent is done, the impossible is underway. For miracles, provide for a delay...
    0
    1. BunoCS Messages postés 15922 Date d'inscription   Statut Modérateur Dernière intervention   3 931
       
      Note: pour te simplifier la vie avec les findViewByID, je te conseille de regarder la lib ButterKnife
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. donnemoifaim Messages postés 11 Statut Membre
     
    Ok, j'ai suivi tes multiples conseils, j'ai donc initié la webview (ce qui m'étonne, c'est que dans le lien exemple que tu m'as donné, ça n'y était pas ! )

    Petit beug : quand on clique sur facebook log : l'application donnemoifaim s'arrete

    Donc l'application se lance bien, pas de problème aucune erreur niveau code, idem pour les logs mon activity_mail.xml est devenu :

    <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"
    />
    </FrameLayout>


    Pour le fichier .java :

    package fr.donnemoifaim.donnemoifaim;

    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.Message;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    import android.webkit.*;
    import android.webkit.WebChromeClient;
    import android.widget.FrameLayout;
    import android.widget.ProgressBar;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;

    public class MainActivity extends Activity {

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

    private String url = "https://donnemoifaim.fr";
    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);

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

    WebView mainWebView = new WebView(this);
    setContentView(mainWebView);

    //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);

    mainWebView.setWebViewClient(new MyCustomWebViewClient());
    mainWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);

    mainWebView.setWebChromeClient(new MyCustomChromeClient());
    mainWebView.loadUrl("https://donnemoifaim.fr");

    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);
    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"))
    {
    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);
    }

    }

    private class MyCustomChromeClient 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");
    }

    }
    }


    Il doit manquer un tout petit rien du tout, si l'appli s'arrête, c'est que la méthode à bien été lancée, je fais mes recherches et bidouille un peu à droite à gauche, tiens moi au courant si tu trouves l'erreur potentielle :) !

    les logs :

    Installing fr.donnemoifaim.donnemoifaim
    DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/fr.donnemoifaim.donnemoifaim"
    pkg: /data/local/tmp/fr.donnemoifaim.donnemoifaim
    Success

    Launching application: fr.donnemoifaim.donnemoifaim/fr.donnemoifaim.donnemoifaim.MainActivity.
    DEVICE SHELL COMMAND: am start -n "fr.donnemoifaim.donnemoifaim/fr.donnemoifaim.donnemoifaim.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
    Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=fr.donnemoifaim.donnemoifaim/.MainActivity }
    0
  7. donnemoifaim Messages postés 11 Statut Membre
     
    Bon j'ai trouvé le problème, j'espère pouvoir aider d'autre :

    Le code est bon, le truc c'est qu'il faut ajouter après la déclaration de la webview et avant le chargement de la page :

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
    CookieManager.getInstance().setAcceptThirdPartyCookies(mainWebView, true);
    }

    Cela permet d'autoriser les cookies Facebook ! Je vous dis pas comment j'en est chier, surtout que c'est un beug que meme facebook connaissait mais n'a pas pris le temps de résoudre :

    https://developers.facebook.com/docs/facebook-login/android/v2.3

    Voici la source de la solution qui m'a beaucoup aidé :

    https://stackoverflow.com/questions/28197150/checking-facebook-login-state-in-a-webview-always-returns-unknown
    0