Facebook connect / webview android ne fonctionne pas

Fermé
donnemoifaim Messages postés 6 Date d'inscription samedi 23 mai 2015 Statut Membre Dernière intervention 2 juin 2015 - Modifié par donnemoifaim le 28/05/2015 à 03:20
donnemoifaim Messages postés 6 Date d'inscription samedi 23 mai 2015 Statut Membre Dernière intervention 2 juin 2015 - 2 juin 2015 à 00:37
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 :)) !!
A voir également:

6 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
Modifié par BunoCS le 28/05/2015 à 11:20
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
donnemoifaim
28 mai 2015 à 13:53
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
donnemoifaim Messages postés 6 Date d'inscription samedi 23 mai 2015 Statut Membre Dernière intervention 2 juin 2015
28 mai 2015 à 16:14
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
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
28 mai 2015 à 16:52
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
donnemoifaim Messages postés 6 Date d'inscription samedi 23 mai 2015 Statut Membre Dernière intervention 2 juin 2015
28 mai 2015 à 23:49
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
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
Modifié par BunoCS le 29/05/2015 à 11:19
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
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
29 mai 2015 à 11:22
Note: pour te simplifier la vie avec les findViewByID, je te conseille de regarder la lib ButterKnife
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
donnemoifaim Messages postés 6 Date d'inscription samedi 23 mai 2015 Statut Membre Dernière intervention 2 juin 2015
Modifié par donnemoifaim le 30/05/2015 à 17:18
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
donnemoifaim Messages postés 6 Date d'inscription samedi 23 mai 2015 Statut Membre Dernière intervention 2 juin 2015
2 juin 2015 à 00:37
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