Webview loadDataWithBaseUrl Desktop-Version wird angezeigt

  • Antworten:6
  • Bentwortet
Andreas B.
  • Forum-Beiträge: 23

15.10.2014, 12:00:09 via Website

Guten Morgen

hier mein kleines Problemchen:

Zuerst lade ich den Quellcode runter, da ich später noch die <img> Tags parse, damit man die Bilder auf der Website auch downloaden kann.
Danach zeige ich die (veränderte) Website in einer WebView an mit "LoadDataWithBaseUrl", damit auch externe (css, javascript) Dateien eingebunden werden.

1) Nun wird aber nicht die mobile Version der Website angezeigt sondern die Desktop-Version! Wenn ich "loadUrl" nutze wird er in der mobilen Version angezeigt, nur sind eben die externen Dateien nicht dabei.
2) Ausserdem werden Umlaute nicht richtig angezeigt. Irgendwie habe ich das Gefühl, ich habe den Quellcode irgendwo mal kaputt gemacht...

Hier natürlich noch die Codes:
Browser.java

package ch.andireas.calc_it1;


import java.io.*;

import org.apache.http.client.*;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;

import ch.andireas.calc_it1.R;

import android.annotation.*;
import android.app.*;
import android.content.*;

import android.os.*;
import android.util.*;
import android.view.*;
import android.view.View.*;
import android.webkit.*;
import android.webkit.WebSettings.*;
import android.widget.*;

public class Browser extends Activity {

    public String url;
    public String response_str;
    public DefaultHttpClient HTTPclient;
    public HttpGet request;
    public ResponseHandler<String> responseHandler;
    public String website = "";
    public String website_old = "";
    private WebView webView;
    EditText urlEditText;
    WebViewClient myWebViewClient;
    public boolean website1 = false;


    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.browser_main);

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


        myWebViewClient = new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url){

                startDownload(url);

                return false;
            }

        };


        urlEditText = (EditText) findViewById(R.id.urlField);
        urlEditText.setText("");

        Button openUrl = (Button) findViewById(R.id.goButton);

        WebSettings zoomenable = webView.getSettings();
        zoomenable.setBuiltInZoomControls(true);
        WebSettings wideviewenable = webView.getSettings();
        wideviewenable.setUseWideViewPort(true);

        webView.setWebViewClient(myWebViewClient);

        openUrl.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {

                url = urlEditText.getText().toString();

                if ((url.startsWith("https://")) || (url.startsWith("http://"))) {
                    website = url;
                } else if (url.startsWith("www.")) {
                    website = "http://" + url;
                    urlEditText.setText("http://" + url);

                } else if (url != "") {
                    website = "https://google.ch/search?q=" + url;

                }


                WebSettings settings = webView.getSettings();
                settings.setLoadsImagesAutomatically(true);
                settings.setLoadWithOverviewMode(true);
                settings.setUseWideViewPort(false);
                settings.setJavaScriptEnabled(true);
                settings.setJavaScriptCanOpenWindowsAutomatically(true);
                settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL); 
                settings.setDefaultTextEncodingName("UTF-8");

                Thread codeThread = new Thread(new quellcode());
                codeThread.start();

            }
        });
    }

        private void startDownload(final String url) {
        Downloader.DownloadCompleteListener dcl = new Downloader.DownloadCompleteListener() {
            @Override
            public void onDownloadComplete(final String result) {

                FileOutputStream outputStream;

                try {
                  outputStream = openFileOutput("Website1.txt", Context.MODE_PRIVATE);
                  outputStream.write(result.getBytes());

                  outputStream.close();

                } catch (Exception e) {
                  e.printStackTrace();
                }
                webView.post(new Runnable(){

                    @Override
                    public void run() {

                        webView.loadDataWithBaseURL(url, result ,"text/html","UTF-8",null);
                    }

                });

            }
        };

        Downloader downloader = new Downloader(dcl);
        downloader.execute(url);
    }

    public class quellcode implements Runnable {

        public void start() {

        }

        public void run() {
            HTTPclient = new DefaultHttpClient();
            request = new HttpGet(website);
            final WebView webView = (WebView) findViewById(R.id.webView);
            startDownload(website);
            webView.post(new Runnable(){

                @Override
                public void run() {

                    webView.loadUrl(website);

                }

            });
            responseHandler = new BasicResponseHandler();

        }

    }

}

Ps: Ich weiss ich muss unbedingt noch den HTTPClient ersetzen!

Downloader.java

package ch.andireas.calc_it1;

import java.io.*;

import org.apache.http.*;
import org.apache.http.client.*;
import org.apache.http.impl.client.*;
import android.os.*;


public class Downloader extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {
        String response = "";
        for (String url : urls) {
            response += downloadWebpage(url);
        }

        return response.toString();
    }

    private String downloadWebpage(String url) {

        try {
            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(url);

            HttpResponse response = client.execute(get);

            InputStream in = response.getEntity().getContent();

            BufferedReader reader = new BufferedReader(new InputStreamReader(in));

            String source = "";
            String tmp;
            int i = 1;
            while ((tmp = reader.readLine()) != null) {
                source += tmp;

                i++;
            }

            return parsen(source);
        } catch (IOException io) {

            io.printStackTrace();
            return "Error when downloading Webpage" + url;

        }
    }

    public interface DownloadCompleteListener {

        void onDownloadComplete(String result);

    }

    private DownloadCompleteListener dc = null;

    public Downloader(DownloadCompleteListener dc) {

        this.dc = dc;
    }

    @Override
    protected void onPostExecute(String result) {

        dc.onDownloadComplete(result);
    }

    public String parsen(String quellcode){
        //Hier werden die img-Tags geparst und Javascript dazugef&uuml;hrt
        return quellcode;
    }

}

Hier noch 2 Bilder, wie es mit "LoadDataWithBaseUrl" aussieht.

User uploaded photo

User uploaded photo

Ich danke für jede Hilfe!

Freundliche Grüsse Andireas99

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.10.2014, 13:21:56 via App

Hallo Andreas.
Das mit der Desktop seite liegt warelscheinlich daran, dass der HttpClient den Http Header besser gesagt den http 7ser Agent für Desktop seiten sind. Wenn du diesen auf mobil umstellst sollte es klappen.
Bei den Umlauten ist das charset Entscheident da musst du immer prüfen welches charset die html Seite hat. Umlaute werden meist in Utf8 angezeigt. Deswegen würde ich es damit mal probieren

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Andreas B.

Antworten
Andreas B.
  • Forum-Beiträge: 23

15.10.2014, 14:49:43 via Website

Hallo Pascal
erstmals danke für deine schnelle Antwort! :)

Ich hab mir mal den User-Agent-String ausgeben lassen mit "webView.getSettings().getUserAgentString()".
Raus gekommen ist: Mozilla/5.0 (Linux; Android 4.4.4; Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36

Scheint für mich so weit in Ordnung zu sein...

Zu den Umlauten: Ich hab mir jetzt mal den Quellcode von Google angeschaut und es scheint tatsächlich utf-8 zu sein. Jedoch habe ich um auf Numer sicher zu gehen noch ein Charset-Validator darüber laufen lassen, und dieser meint es sei "iso-8859-1".

Jetzt habe ich "webView.getSettings().setDefaultTextEncodingName("UTF-8" );" und "webView.loadDataWithBaseURL(url, result ,"text/html","UTF-8",null);" versucht und auch utf-8 durch "iso-8859-1"ersetzt. Leider beides ohne Erfolg...

Lg Andreas

— geändert am 15.10.2014, 14:51:46

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.10.2014, 15:29:08 via Website

Hallo Andreas, ich meinte eigentlich den User Agent des WebCleints, da du mit diesem ja den Quellcode lädst.
Was hat denn die HTML selbst für ein charset? (aus dem Quelltext übers charset Metatag)?

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Andreas B.

Antworten
Andreas B.
  • Forum-Beiträge: 23

15.10.2014, 15:47:18 via Website

Uuups falsch verstanden werde es gleich mal überprüfen :D

Im charset Metatag steht utf-8.

EDIT:

Hab jetzt mal "client.getParams().getParameter(CoreProtocolPNames.USER_AGENT)" mir ausgeben lassen und als Ergebniss kam "Apache-HttpClient/UNAVAILABLE (java 1.4)"

Werde mich gleich mal besser darüber informieren was dies zu bedeuten hat. :)

Lg Andreas

EDIT: Ohh das ich ja gar kein Error an sich sondern das ist offenbar einfach der default Wert.

Nun habe ich den UserAgentString neu befüllt mit

HTTPclient.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "Mozilla/5.0 (Linux; Android 4.4.4; Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36");

Uuuuuuuund ES GEHT :D:D
Und aus irgend einem grund hat sich auch das Sonderzeichen-Problem behoben :D

Tausend Dank Pascal (cool)

— geändert am 15.10.2014, 17:25:26

Antworten
Andreas B.
  • Forum-Beiträge: 23

15.10.2014, 21:17:00 via Website

Habe jetzt noch die HttpUrlConnection eingefügt.
Falls es jemanden interessiert, der User-Agent funktioniert dort so:
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Linux; Android 4.4.4; Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36");

— geändert am 15.10.2014, 21:18:28

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.10.2014, 21:21:11 via App

Kein Problem :)

Bitte setzte deinen Thread dann noch auf beantwortet (über deinem ersten Post auf "Mehr"->Beantwortet.

Danke

LG Pascal

— geändert am 15.10.2014, 21:21:22

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten