Webview loadDataWithBaseUrl Desktop-Version wird angezeigt

A

andireas99

Neues Mitglied
2
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... :razz:



Hier natürlich noch die Codes:
Browser.java
Code:
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!

Donloader.java
Code:
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ührt
        return quellcode;
    }
    
}
Hab noch 2 Bilder angehängt, wie es mit "LoadDataWithBaseUrl" aussieht.

Ich danke für jede Hilfe! :winki:

Freundliche Grüsse Andireas99
 

Anhänge

  • Screenshot_1.png
    Screenshot_1.png
    7,8 KB · Aufrufe: 182
  • Screenshot_2.png
    Screenshot_2.png
    23,2 KB · Aufrufe: 180
Du müsstest sicher in deinem HTTPClient einen Useragent setzen der ihn als mobilen Browser kennzeichnet (wenn die Seite nicht irgendwie über Javascript das Gerät prüft). Eine weitere Möglichkeit wäre direkt die Mobile Seite zu laden falls sie eine eigene URL hat.

Bevor du dich aber damit beschäftigst würde ich es aber besser direkt richtig machen und den HTTPClient ersetzen.
 
Das mit dem HttpClient schmerzt schon. ;)

Du muss ein User Agent setzen. Das Beispiel benutzt den aktuellen Agenten vom Nexus 5.

Code:
String userAgent = "Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/_BuildID_)  AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 [B]Chrome/30.0.0.0 Mobile[/B] Safari/537.36"; 
HttpClient httpClient = new DefaultHttpClient();
HttpProtocolParams.setUserAgent(httpclient.getParams(), userAgent);
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
10
Aufrufe
220
swa00
swa00
U
  • unerfahrenerAppEntwickler
Antworten
3
Aufrufe
705
swa00
swa00
K
Antworten
3
Aufrufe
1.168
Kapikalaani
K
Zurück
Oben Unten