Partage
  • Partager sur Facebook
  • Partager sur Twitter

[ANDROID] Injecter CSS/JS dans une WebView

Anonyme
    28 janvier 2012 à 16:07:25

    Bonjour,
    Je charge une page web dans une webview et j’aimerai modifier le css pour l’adapter à l’écran. Sachant que je ne suis pas propriétaire de la page que je charge, comment modifier ce css ?

    Voila ce que j’ai fait mais le code n’est pas injecter :

    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.main);
    WebView webView = (WebView) findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);
    
    webView.setWebChromeClient(new WebChromeClient() {
    public void onProgressChanged(WebView view, int progress)
    {
    activity.setTitle(« Loading… »);
    activity.setProgress(progress * 100);
    
    if(progress == 100)
    activity.setTitle(R.string.app_name);
    }
    });
    
    webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
    {
    // Handle the error
    }
    
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url)
    {
    view.loadUrl(url);
    return true;
    }
    });
    webView.loadUrl(« http://monsite.com »);
    //Pour le changement de css
    final String css = « #header { display:none; } »;
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebChromeClient(new WebChromeClient() {
    // On remplace l’action par défaut (qui est… vide) et on charge notre CSS
    public void onPageFinished(WebView view, String url) {
    view.loadUrl(« javascript: »
    + « var styles = document.createElement(‘STYLE’);  »
    + « styles.innerHTML = ‘ »+ css + »‘; »
    + « document.body.appendChild(styles) »);
    }
    });
    //fin d’ajout
    }
    


    Merci d’avance à ceux qui pourront m'aider ;)
    • Partager sur Facebook
    • Partager sur Twitter
      29 janvier 2012 à 17:23:20

      Bonjour,

      Les modifs de présentation se font côté serveur, pas côté client.
      Il faut donc que le propriétaire du site ait prévu une version mobile.
      • Partager sur Facebook
      • Partager sur Twitter
        29 janvier 2012 à 17:53:28

        remplace tout tes « par des "
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          31 janvier 2012 à 11:06:07

          Bonjour,

          En faite, je veux modifier l'apparence d'une application mobile d'un site qui n'est pas pratique du tout.
          Avec une extension Chrome on peut par exemple ajouter une feuille de style à n'importe quel site, et j'aimerais faire la même chose mais avec le navigateur d'Android et le composant Webview.
          Je ne pense pas qu'il y ait quelque chose à faire coté serveur ?
          Merci pour ta réponse. :)

          Edit : Ok herve1234.
          Mais il me semble que c'est l'éditeur du sdz qui les à changé.
          Je test en rentrant chez moi et je te dit.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            1 février 2012 à 21:30:03

            herve1234, c'est bien des " dans mon code.
            Une autre idée ?
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              7 février 2012 à 17:50:11

              Up ! :)
              Quelqu'un sait comment faire pour modifier une page web dans une webview android ? Merci.
              • Partager sur Facebook
              • Partager sur Twitter
                7 février 2012 à 18:54:33

                Je vais me répéter mais on peut pas: une WebView est juste une sorte de navigateur très light embarqué.
                Donc les CSS, comme pour tous les sites, sont chargés depuis le serveur.
                C'est au dév du site de détecter le User-Agent et de proposer un CSS en adéquation.
                • Partager sur Facebook
                • Partager sur Twitter
                  8 février 2012 à 13:12:17

                  Je me permet d'intervenir dans la discution.

                  @Fumble: Faux, faux et archi-faux !
                  L'HTML, le JAVASCRIPT et le CSS sont chargé côté CLIENT !
                  Quand on charge une page internet, le serveur fait des modifications si nécessaire ( c'est là que le PHP intervient par exemple )
                  et le serveur nous envois, en gros, du texte (html).

                  Le client ( navigateur, light et embarqué ne change rien ) se charge de comprendre le texte sur serveur et l’interpréter comme de l'HTML. Il s'occupe donc de chercher les différentes fiches CSS, il comprend le Javascript et agis tes qu'il doit le faire.
                  Il s'occupe de mettre en place les balises pour formater le texte.

                  @dorian07d: Ce n'est pas simple, mais je suis en train de plancher dessus.
                  Le principe serait de récupérer le code HTML de ta page via le moyen de ton choix, de modifier ce que tu souhaites dans ta page avec les fonctions propre à String et les regex si besoin est, et de charger ta webView grâce à loadData !

                  Bonne chance
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 février 2012 à 13:40:09

                    Citation : lamihck



                    @dorian07d: Ce n'est pas simple, mais je suis en train de plancher dessus.
                    Le principe serait de récupérer le code HTML de ta page via le moyen de ton choix, de modifier ce que tu souhaites dans ta page avec les fonctions propre à String et les regex si besoin est, et de charger ta webView grâce à loadData !

                    Bonne chance



                    Ou d'injecter du js comme pour greasemonkey par exemple.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 février 2012 à 14:01:59

                      C'est pas du code propre, mais ça fonctionne ^^'
                      Petite explication : on récupère le code source d'une page nécessitant un login et un mot de passe en Post.
                      simple String.replace pour ajouter du JS dans le onLoad du Body.
                      On injecte dans la webview

                      super.onCreate(savedInstanceState);
                              WebView webview = new WebView(this);
                              setContentView(webview);
                              WebSettings webSettings = webview.getSettings();
                              webSettings.setJavaScriptEnabled(true);
                      
                              webview.setWebViewClient(new WebViewClient());
                              String result = null;
                              BufferedReader in = null;
                              try {
                                  HttpClient client = new DefaultHttpClient();
                                  HttpPost request = new HttpPost("https://Perso.com/moncompte/index.php?page=suiviconso");
                                  List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
                                  postParameters.add(new BasicNameValuePair("login_abo", "XXXXXX"));
                                  postParameters.add(new BasicNameValuePair("pwd_abo", "XXXXXX"));
                                  UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
                                  request.setEntity(formEntity);
                                  HttpResponse response = client.execute(request);
                                  in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                                  StringBuffer sb = new StringBuffer("");
                                  String line = "";
                                  String NL = System.getProperty("line.separator");
                                  while ((line = in.readLine()) != null) {
                                      sb.append(line + NL);
                                  }
                                  in.close();
                                   result = sb.toString();
                                  } catch (UnsupportedEncodingException e) {
                      				// TODO Auto-generated catch block
                      				e.printStackTrace();
                      			} catch (IllegalStateException e) {
                      				// TODO Auto-generated catch block
                      				e.printStackTrace();
                      			} catch (IOException e) {
                      				// TODO Auto-generated catch block
                      				e.printStackTrace();
                      			} finally {
                                  if (in != null) {
                                      try {
                                          in.close();
                                          } catch (IOException e) {
                                          e.printStackTrace();
                                      }
                                  }
                              }
                              
                      		
                      		result=result.replace("<body>", "<body onLoad=\"CODE JS\">");
                      		
                      		webview.loadData(result, "text/html", "UTF-8");
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 février 2012 à 18:53:18

                        Citation : lamihck

                        Je me permet d'intervenir dans la discution.

                        @Fumble: Faux, faux et archi-faux !
                        L'HTML, le JAVASCRIPT et le CSS sont chargé côté CLIENT !
                        Quand on charge une page internet, le serveur fait des modifications si nécessaire ( c'est là que le PHP intervient par exemple )
                        et le serveur nous envois, en gros, du texte (html).

                        Le client ( navigateur, light et embarqué ne change rien ) se charge de comprendre le texte sur serveur et l’interpréter comme de l'HTML. Il s'occupe donc de chercher les différentes fiches CSS, il comprend le Javascript et agis tes qu'il doit le faire.
                        Il s'occupe de mettre en place les balises pour formater le texte.



                        C'est bien ce que je dis: le client récupère la page HTML depuis le serveur (ou si tu préfères, le serveur lui envoie). C'est ce que signifie "chargé depuis". Sinon, j'aurais dit "chargé sur" ou "chargé par" En aucun je n'ai mentionné une interprétation du code côté serveur. Idem pour JS et CSS.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          8 février 2012 à 20:27:29

                          Merci pour vos réponses.
                          Fumble, ta réponse était ambiguë car je l'ai compris comme lamihck.
                          lamihck j'ai essayé ta méthode brut, et même si je comprend le principe, elle plante au démarrage.
                          Alors j'ai essayé de modifié avec ce que j'ai fait précédemment, mais c'est pareil.
                          Ce sont surtout les paramétres que tu envois qui m'embrouille un peu.
                          Est-ce que tu pourrais mettre l'essentiel avec un commentaire par ligne (...) ?

                          Merci bien et bon boulot en tout cas ! ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 février 2012 à 18:03:46

                            Alors alors,

                            Sur Internet, on peut transmettre des données d'une page à l'autre via plusieurs solution.
                            Les deux plus connus sont les GET et les POST, qui sont souvent le résultat de la validation d'un formulaire (<form>)

                            Dans mon code, j'envois des informations en POST à ma page, grâce à une requette de type HttpPost.


                            super.onCreate(savedInstanceState);
                            
                            // On créer et ajoute une webView
                                    WebView webview = new WebView(this);
                                    setContentView(webview);
                            // On accepte le JS
                                    WebSettings webSettings = webview.getSettings();
                                    webSettings.setJavaScriptEnabled(true);
                            
                            // On ajoute un client Web
                                    webview.setWebViewClient(new WebViewClient());
                            
                            // On initialise les variables qui seront utiles dans les try/catch
                                    String result = null;
                                    BufferedReader in = null;
                            
                            // On commence le processus de récupération de la page
                                    try {
                            // On créer un client HTTP
                                        HttpClient client = new DefaultHttpClient();
                            // On prépare une requête POST, pour envoyer des données de formulaire par exemple, ici la page concernée
                                        HttpPost request = new HttpPost("https://Perso.com/moncompte/index.php?page=suiviconso");
                                        List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
                            // On donne les parametres
                                        postParameters.add(new BasicNameValuePair("login_abo", "XXXXXX"));
                                        postParameters.add(new BasicNameValuePair("pwd_abo", "XXXXXX"));
                            // On formate le bouzin
                                        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
                                        request.setEntity(formEntity);
                            // On exécute la requête sur le serveur donné avec les paramètres donnés
                                        HttpResponse response = client.execute(request);
                            // On a notre réponse sous forme de flux, ensuite c'est le processus pour transformer ce flux en String
                                        in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                                        StringBuffer sb = new StringBuffer("");
                                        String line = "";
                                        String NL = System.getProperty("line.separator");
                                        while ((line = in.readLine()) != null) {
                                            sb.append(line + NL);
                                        }
                                        in.close();
                                         result = sb.toString();
                                        } catch (UnsupportedEncodingException e) {
                            				// TODO Auto-generated catch block
                            				e.printStackTrace();
                            			} catch (IllegalStateException e) {
                            				// TODO Auto-generated catch block
                            				e.printStackTrace();
                            			} catch (IOException e) {
                            				// TODO Auto-generated catch block
                            				e.printStackTrace();
                            			} finally {
                                        if (in != null) {
                                            try {
                                                in.close();
                                                } catch (IOException e) {
                                                e.printStackTrace();
                                            }
                                        }
                                    }
                                    
                            // On remplace ce qu'on veut dans notre code HTML récupéré en String
                            		result=result.replace("<body>", "<body onLoad=\"CODE JS\">");
                            // On l'injecte dans notre webView 		
                            		webview.loadData(result, "text/html", "UTF-8");
                            


                            Tu peux facilement contourner le POST pour interoger une URL sans envoyer de donnée grâce à HttpGet !

                            Je n'ai pas testé, mais regarde les différences entre ci dessus et ci dessous :)

                            super.onCreate(savedInstanceState);
                            
                            // On créer et ajoute une webView
                                    WebView webview = new WebView(this);
                                    setContentView(webview);
                            // On accepte le JS
                                    WebSettings webSettings = webview.getSettings();
                                    webSettings.setJavaScriptEnabled(true);
                            
                            // On ajoute un client Web
                                    webview.setWebViewClient(new WebViewClient());
                            
                            // On initialise les variables qui seront utiles dans les try/catch
                                    String result = null;
                                    BufferedReader in = null;
                            
                            // On commence le processus de récupération de la page
                                    try {
                            // On créer un client HTTP
                                        HttpClient client = new DefaultHttpClient();
                            // On prépare une requête GET
                                        HttpGet request = new HttpGet("https://Perso.com/moncompte/index.php?page=suiviconso");
                            // On exécute la requête sur le serveur donné avec les paramètres donnés
                                        HttpResponse response = client.execute(request);
                            // On a notre réponse sous forme de flux, ensuite c'est le processus pour transformer ce flux en String
                                        in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                                        StringBuffer sb = new StringBuffer("");
                                        String line = "";
                                        String NL = System.getProperty("line.separator");
                                        while ((line = in.readLine()) != null) {
                                            sb.append(line + NL);
                                        }
                                        in.close();
                                         result = sb.toString();
                                        } catch (UnsupportedEncodingException e) {
                            				// TODO Auto-generated catch block
                            				e.printStackTrace();
                            			} catch (IllegalStateException e) {
                            				// TODO Auto-generated catch block
                            				e.printStackTrace();
                            			} catch (IOException e) {
                            				// TODO Auto-generated catch block
                            				e.printStackTrace();
                            			} finally {
                                        if (in != null) {
                                            try {
                                                in.close();
                                                } catch (IOException e) {
                                                e.printStackTrace();
                                            }
                                        }
                                    }
                                    
                            // On remplace ce qu'on veut dans notre code HTML récupéré en String
                            		result=result.replace("<body>", "<body onLoad=\"CODE JS\">");
                            // On l'injecte dans notre webView 		
                            		webview.loadData(result, "text/html", "UTF-8");
                            
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              9 février 2012 à 22:16:06

                              Merci pour ta réponse et le temps que tu consacres à mon soucis !
                              Je comprend très bien ce que tu fais.
                              Ton code est bon, éclipse ne trouve aucune erreur.
                              Mais l'application ne fonctionne pas, à la ligne
                              "HttpResponse response = client.execute(request);"
                              Le programme va directement au finally et plante après.
                              Je ne sais pas d'ou peut venir l'erreur.
                              C'est le traitement sur le code de la page web récupéré qui plante.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                10 février 2012 à 9:41:24

                                Citation : Fumble


                                Donc les CSS, comme pour tous les sites, sont chargés depuis le serveur.


                                Citation : Fumble

                                le client récupère la page HTML depuis le serveur (ou si tu préfères, le serveur lui envoie)



                                Mais peuvent être court-circuité entre le serveur et le navigateur donc.

                                Je comprend du coup mieux ce que tu souhaitais exprimer :)

                                @dorian07d : Ajoute du débug dans les catch, peut être que tu verras l'erreur.
                                Tu es sous proxy ?
                                La page existe bien ?
                                La page demande des informations de connexion ?
                                La page nécessite un cookie ?
                                La page est sur le protocole HTTP ?
                                La taille du buffer est bien > 0 a la reception de ta page ?

                                C'est ce genre de question que tu dois te poser ^^
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  11 février 2012 à 20:31:33

                                  Je ne suis pas sur un proxy, la page existe (j'ai mi google.fr), il n'y a pas de demande d'info de connexion, ni de cookie, je suis en http, et le buffer est bien supérieur à 0. Le problème est que la méthode client.execute(request); ne peut pas ce faire sur la variable request de type httpGet ,et vu que je ne l'ai jamais employé, ben je sais pas comment résoudre ce soucis.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    13 février 2012 à 9:35:32

                                    HttpGet request = new HttpGet();
                                    request.setURI(new URI("http://w3mentor.com/"));
                                    


                                    C'est une autre manière de faire, toute aussi fiable à mon avis, a tester !

                                    Source

                                    HttpGet method = new HttpGet("http://mysite.com/test.php?first=<>&last=<>&address=<>&phone=<>&zip=<>&email=<>");
                                                    HttpClient client = new DefaultHttpClient();
                                                    try {
                                                        client.execute(method);
                                                    } catch (ClientProtocolException e) {
                                                        // TODO Auto-generated catch block
                                                        Log.e("",e.getMessage());
                                                    } catch (IOException e) {
                                                        // TODO Auto-generated catch block
                                                        Log.e("",e.getMessage());
                                                    }
                                    


                                    Devrais aussi marché pourtant, tu auras un log de tes erreurs dans le logcat Android

                                    source
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      13 février 2012 à 15:29:32

                                      Ok, j'essaye ça ce soir.
                                      Par contre j'ai pensé à un autre problème.
                                      Cette méthode récupére le code HTML/CSS/JS de la page pour ensuite le modifier, puis l'envoyer dans la webview qui va interpréter ce code.
                                      Ce qui signifie qu'il n'y aura plus de lien avec le serveur de la page.
                                      Or, ma page (comme beaucoup d'autres) utilise de l'ajax, ce n'est pas une simple page HTML. Donc même si j'arrive à l'afficher dans la webview, je ne pourrais rien faire dessus.
                                      Il faudrait que la modification du code ce fasse dynamiquement, comme le font les extensions des navigateurs.
                                      Sauf si mon raisonnement est incorrecte.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        14 février 2012 à 8:49:11

                                        Tout dépend si les liens de la page sont absolus ou non !
                                        Si ils sont relatifs, alors ça risque de poser un problème, mais faut tester :)

                                        Pour la modification dynamique, ça reviens à surcharger la classe de la webView.
                                        C'est pas impossible, au contraire, mais c'est déjà plus dur !

                                        En gros l'idée serait de créer une classe qui est a des fonctions étendu de webView (extends) en modifiant certaines méthodes par rapport à l'originale, et de la placer à la place d'un composant webView.

                                        La je suis flou dans mes paroles, car j'ai pas encore testé et vérifier la faisabilité de la chose ^^

                                        Bonne chance à toi
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          14 février 2012 à 18:02:18

                                          Dak, j'ai essayer de faire tout ça en php (récupérer le code de la page et le modifier), mais même en réécrivant tout les liens, ça ne marchais pas.
                                          Donc il faut un truck complètement dynamique basé sur la webview.
                                          En faite la tu veux créer un nouveau composant basé sur la webview si j'ai bien compris. Ça peut être bien, mais je ne pense pas que ce soit judicieux (beaucoup de travail pour au final peu de choses.).
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          [ANDROID] Injecter CSS/JS dans une WebView

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                          • Editeur
                                          • Markdown