Du bist nicht angemeldet.

JuKu

Profi

  • »JuKu« ist der Autor dieses Themas

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

1

21.02.2013, 18:35

Webseite auslesen

Hier mal nen Mini-Tutorial wie man eine Webseite ausliest. ;)
(Eig. könnte man es mehr als Code-Schnippselchen bezeichnen)
Da ich selbst auch sehr große Probleme am Anfang mit diesem Thema hatte, möchte ich mein Wissen darüber mit euch teilen. :D

Voraussetzungen / Kentnisse:
- Java Kentnisse
- Eine vollständig eingerichtete Entwicklungsumgebung und das Android-SDK.
- Erste Erfahrungen in der Android-Programmierung

Wenn ihr einige dieser Voraussetzungen noch nicht mitbringt, empfehle ich euch Eriks Android-Tutorial. ;)

Vorweg:
Viele, die nach "Android: Webseite auslesen" googeln, und den Code dann anpassen, machen immer den selben Fehler. ^^
(So auch ich, bis vor kurzem. :D )
Zuerst muss man wissen, das Android ein recht aufwändiges Rechte-System besitzt.
Jede App bekommt Rechte zugewiesen, z.B. ob sie die Kamera nutzen darf, ob sie eine Datei auf der SD-Karte speichern darf usw.
Man benötigt also verschiedene Rechte, um verschiedene Sachen machen zu dürfen, wenn eine Anwendung ein bestimmtes Recht nicht hat und aber nutzen will, stürtzt die App meistens ab und es kommt so was in der Art wie "unfortunately, the activity has stopped.". (weiß jetzt gar nicht genau, wie die Fehlermeldung heißt.^^)
Auch ist es bei Android so, dass aufwändige Sachen, wie das Herstellen einer Verbindung bzw. das Auslesen einer Webseite nicht in der UI, also in einem Activity vorkommen dürfen.
Das würde nämlich die ganze ANwendung zum stocken bringen.

Was für Berechtigungen brauchen wir?
Wir brauchen die folgenden 3 Berechtigungen:
  • android.permission.INTERNET (darf das Internet nutzen)
  • android.permission.ACCESS_NETWORK_STATE (darf feststellen, ob eine Verbindung besteht)
  • android.permission.CHANGE_NETWORK_STATE (darf eine Verbindung herstellen)

Diese müsst ihr in eurer Manifest.xml-Datei hinzufügen. (Am Besten geht das mit Eclipse, der bietet so nen speziellen Manifest-Editor dafür, damit ist das ein Kinderspiel. ;) )
Bsp.:

Spoiler Spoiler


HTML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.juku.tensingapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>

... weiter Code, wie die ganzen Activitys usw. ...

</manifest>



Nun zum Code:
Wie gesagt brauchen wir für solche Aufgaben z.B. einen Thread.
In unserem Fall möchte ich als Beispiel mal die Webseite von Google auslesen.
Also schreiben wir uns einen Thread, welcher genau das macht. :D

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.IOException;
import org.apache.http.client.*;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.*;

import android.util.Log;

public class DeinThread extends Thread {

	public void run () {
		
		HttpClient client = new DefaultHttpClient();
		HttpGet request = new HttpGet("http://google.de");
		
		ResponseHandler<String> responseHandler = new BasicResponseHandler();
		
		try {
			String response_str = client.execute(request, responseHandler);
			Log.println(Log.ERROR, "HTTPClient", "Antwort des Requests: " + response_str);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}


Ich habe hier die Antwort des Servers einfach per

Java-Quelltext

1
Log.println(Log.ERROR, "HTTPClient", "Antwort des Requests: " + response_str);
im Logger ausgeben lassen.
Solltet ihr, wie ich, Logcat in Eclipse integriert haben, solltet ihr jetzt einen roten Text (weil ich es als Error gekennzeichnet habe (>>Log.ERROR<<)) im Logger mit dem Quelltext der Webseite sehen. ;)
Aber vorher müsst ihr den Thread natürlich noch starten, z.B. indem ihr eine Activity erstellt:

Spoiler Spoiler

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class TestActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_test);//Euer Layout müsst ihr übrigens noch anpassen. ;)

                DeinThread thread = new DeinThread();
                thread.start();
	}

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

}


So, damit könnt ihr jetzt rein theoretisch Webseiten auslesen. :D
Wer Fragen hat, her damit! :)

Weiter führende Links:
- http://developer.android.com/reference/a…/AsyncTask.html
- Das Ausführen von Aufgaben im Hintergrund
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Es haben sich bereits 2 registrierte Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

Roman (12.12.2013), Erik (12.12.2013)

Roman

Anfänger

Beiträge: 2

Registrierungsdatum: 12.12.2013

  • Private Nachricht senden

2

12.12.2013, 17:13

Hallo, also erstmal danke für das schöne Tutorial, funktioniert fast perfekt. :)
Ich habe nur ein Problem, nämlich dass Umlaute falsch angezeigt werden. z.B. wird für ein ü einfach ü ausgegeben.
Würde mich sehr auf eine Antwort freuen :)

cedi

Profi

Beiträge: 702

Danksagungen: 78

  • Private Nachricht senden

3

13.12.2013, 11:33

Ich sitz gerade in der Schule und kanns ned testen.

Ich frag mich gerade wie ich das verstehen darf, Webseite Auslesen.

Sorry für die blöde Frage.

Aber danke für das gute Tutorial

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

4

13.12.2013, 19:49

naja halt den html-quelltext runterladen...
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

5

16.12.2013, 01:13

@Roman:
An sich liegt das daran, dass ein falsches Encoding genutzt wird. Ich kenne mich allerdings nicht mit der Androit-Entwicklung aus und weiß nicht, wie die Klassen aus dem Tutorial funktionieren. Ich denke es währe auf jeden Fall hilfreich, wenn du weitere Informationen nennen könntest. Zum Beispiel bei welcher Webseite das Problem auftritt, da unterschiedliche Seiten andere Encodings bei für die Daten nutzen. Manchmal wird das Encoding im HTML-Head mit einer Meta-Information wie

HTML

1
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
angegeben.
Andernfalls steht diese Information auch oft im HTTP-Header. Wenn sich das Encoding der Webseite und das Encoding auf dem Androit-Gerät unterscheiden, muss der String auf jeden Fall konvertiert werden. Am Namen der oben genutzten Klasse würde ich ableiten, dass diese nur das HTTP-Protokoll unterstützt und die HTML-Datei nicht nach Informationen wie dem Encoding suchen wird. Wenn das koreckte Encoding nur auf der HTML-Ebene und nicht im HTTP-Header angegeben wird, wirst du die Konvertierung manuell vornehmen müssen. Ob die Klassen die konvertierung selbstständig vornehmen, wenn das richtige Encoding bereits im HTTP-Header übergeben wird, kann ich nicht sagen, da ich wie gesagt die Klassen nicht kenne.
Signatur ?

cedi

Profi

Beiträge: 702

Danksagungen: 78

  • Private Nachricht senden

6

17.12.2013, 09:47

Achsoo Okay :D das ist ja nice ;-)
Danke :)
Sorry für die blöde Frage!

Roman

Anfänger

Beiträge: 2

Registrierungsdatum: 12.12.2013

  • Private Nachricht senden

7

17.12.2013, 17:18

Hmmm, ja das charset ist mit UTF-8 angegeben, demfall macht das der Code offenbar nicht automatisch, wird aber ziemlich mühsam das ganze Manuell zu machen.

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

8

17.12.2013, 21:56

Ich denke, dass es da einfache Möglichkeiten gibt. Falls die Webseite unter deiner Kontrolle ist, kannst du ja mal versuchen den HTTP-Header so zu setzen, dass dieser auch auf UTF8 verweißt. Vieleicht erkennt die Klasse dann das richtige Encoding.

Und gibt es auf Androit nicht die URL-Klasse? Sonst könnte man ja vieleicht mal so wie hinter dem folgenden Link probieren.
http://stackoverflow.com/questions/23854…webpage-in-java

Falls du es wirklich manuell implementieren musst, solltest du es wohl mit Klassen wie der folgenden versuchen:
http://docs.oracle.com/javase/7/docs/api…et/Charset.html
oder noch einfach (habe ich gerade ergoogelt) sowas wie das:
http://stackoverflow.com/questions/57298…string-to-utf-8
Auch hier weiß ich nicht ob die Klasse in der Androit-Version von Java zur verfügung steht.
Signatur ?