[App] Eigener Stundenplaner

  • Antworten:75
  • OffenNicht stickyNicht beantwortet
Gelöschter Account
  • Forum-Beiträge: 33

25.03.2013 15:06:49 via Website

Bin mir da noch nicht so sicher, bisher hab ich einfach den Link dem WebView übergeben um zu sehen ob er funktioniert

Hier mal der Link:
"http s://office.kis.uni-kl.de/views/pia/pia.asp?size=1680&u="+benutzername+"&p="+passwort+"&login=%3E+Login"

und so hab ich mich bisher mit dem View "geprüft" ob der Link funktionert:
Uri uri = Uri.parse(link);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.076

25.03.2013 15:18:10 via Website

Ok, also du gibst die URL in deine App ein und meiner Meinung nach wird dann ein externer Webrowser geöffnet, der dich dein auf der Uniseite einloggt.
Warscheinlich musst du angemeldet sein, um deinen Stundenplan auslesen zu können.
Dann musst du das ganze mit einer WebView machen, denn anders wüden die Sessiondaten nicht erhaltenbleiben.
Oder kannst du dich auf einer Belibigen Unterseite einloggen:
zb. so:
http s://office.kis.uni-kl.de/views/pia/stundenplan.aspx?parameter die du zum Login benötigst

Wenn das mit dem Link (musst du noch auf die richtige seite abändern) funktioniert dann kannst du das Problem ohne WebView lösen.

— geändert am 25.03.2013 15:18:34

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 33

25.03.2013 15:21:58 via Website

Also um mir die Vorlesungen anzeigen zu lassen muss ich angemeldet sein

Antworten
Gelöschter Account
  • Forum-Beiträge: 33

25.03.2013 15:37:54 via Website

Aber wie mach ich das mit dem Aufrufen der Stundenplan URL, da soll ja alles im Hintergrund passieren, ohne das ich in der WebView etwas anklicke?!
Der Nutzer soll einfach nur seine Daten eingeben und ein paar Sekunden später soll ihm in einer neuen Activity der Stundenplan angezeigt werden

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.076

25.03.2013 15:42:32 via Website

Sorry, das habe ich vergessen,du brauchst etwas, dass dich in auf der Seite anmeldet und dann die Anmeldesession auf die Stundenplanseite übernimmt.

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 33

03.04.2013 09:09:50 via Website

Sry, das ich mich jetzt erst melde, war paar Tage leider krank :(
Das mti dem Login hab ich leider immernoch nicht hinbekommen. Hab mir jetzt den Quelltext der Seite auf nen Server gezogen um zumindest mal soweit voran zu kommen, dass ich mir die gewünschten Daten auslesen kann. Klappt soweit auch ganz gut. Lade mir den Quelltext der Seite herunter und speichere ihn in einem String. Jetzt ist nur meine Frage wie ich am besten an die Daten komme, die ich aus dem String brauche?
Hier mal ein kleiner Auszug aus dem String:

<a href="appDispatcher.asp?viewonly=False&back=APPOINTMENTLIST&guid=0x919F608DE8F2AA45AF9FC1BAD6E3FDA5&body=False">H&#246;here Mathematik f&#252;r Bauingenieure II </a></td><td nowrap>&nbsp;Mo. 16.04.2012 08:15 </td>
<td nowrap>&nbsp;Mo. 16.04.2012 09:45

</td><td nowrap>&nbsp;</td></tr><tr class="even"><td width="20"><a href="JavaScript:markRecord(1);"><img name="mark1" src="../../system/utils/img/ioDots/ioUnmarked.gif" width="19" height="15"
border="0" alt="Diesen Termin markieren"></a></td><td nowrap><a href="appointmentList.asp?viewonly=False&back=APPOINTMENTLIST&visibleper=true&periodguid=0x28417E996D098646BEE3D1947021CA7C&body=False"><img src="../../system/utils/
img/ioDots/periodPlus.gif" border="0" alt="Termin einer Serie"></a>&nbsp;

Die Daten die ich benötige habe ich fett markiert. Nur wie durchlaufe ich jetzt den String am besten so, dass ich an die fett markierten Informationen dran komme?

— geändert am 03.04.2013 09:10:20

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.076

03.04.2013 10:46:41 via Website

Solange die Struktur der HTML sich nicht ändert, müsstest du das auch parsen können.

1String suche = "&body=False\">";
2
3 int pos = html.IndexOf(suche) + suche.length();
4 String zwischenschritt = html.substring(pos);
5suche = "</td><td nowrap>";
6 pos = zwischenschritt.IndexOf(suche) + suche.length();
7 String gewünschteDaten= zwischenschritt.substring(0,pos);
So ist es zimlich umständlich.Aber es funktioniert.

Hier auf dieser Seite sind noch ein Paar html Parser aufgelistet:
http://stackoverflow.com/questions/1433250/possible-to-parse-a-html-document-and-build-a-dom-treejava

PS: Ich würde dir mit dem Login gerne helfen :)

— geändert am 03.04.2013 10:47:36

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

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.076

03.04.2013 16:42:56 via Website

Zum Login:

1String benutzername = "AndroidPit";
2 String passwort = "android";
3 HttpClient client = new DefaultHttpClient(); // Http CLient anlegen
4
5 HttpGet httpget = new HttpGet("https://office.kis.uni-kl.de/views/pia/pia.asp?size=1680&u="+benutzername+"&p="+passwort+"&login=%3E+Login");
6
7 try {
8
9 HttpResponse response = client.execute(httpget);
10
11 BufferedReader rd = new BufferedReader
12 (new InputStreamReader(response.getEntity().getContent()));
13
14 String line = "";
15 String out = null;
16 while ((line = rd.readLine()) != null) {
17 out += line;
18 }
19 //String out ist die HTML der Anmeldepage
20
21
22 } catch (Exception e) {
23 // TODO Auto-generated catch block
24 e.printStackTrace();
25 }
26
27
28 HttpGet request = new HttpGet("urlToStundenplan");
29
30 try {
31 HttpResponse response = client.execute(request);
32 BufferedReader rd = new BufferedReader
33 (new InputStreamReader(response.getEntity().getContent()));
34
35 String line = "";
36 String out = null;
37 while ((line = rd.readLine()) != null) {
38 out += line;
39 }
40
41 HTMlParse(out); //Die ausgabe wird in einer externen Funktion geparst.
42 } catch (ClientProtocolException e) {
43 // TODO Auto-generated catch block
44 e.printStackTrace();
45 } catch (IOException e) {
46 // TODO Auto-generated catch block
47 e.printStackTrace();
48 }

Pass aber auf nicht im Ui Thread machen, sonst gibt es eine NetworkOnMain exception.
Am besten in einm Externet Thread oder AsyncTask laufen lassen.

Ich habe diesen Coden bei meiner Homepage getestet und er functioniert.

Hoffe ich konnte dir Helfen

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 33

04.04.2013 09:15:25 via Website

Wow, vielen Dank :)
Ich hab jetzt versucht den Code in einer eigenen Activty zu starten, was leider dazu führt das mir die App abstürzt.
Kannst du mir erklären wie ich den Code in einen Asynctask einbaue. Ich hab es bisher so versucht, hab deinen Code in "gethml()" geschrieben:
1public void onCreate(Bundle savedInstanceState) {
2 super.onCreate(savedInstanceState);
3 setContentView(R.secondmain);
4@Override
5 protected Void doInBackground(Void... params) {
6 gethtml();
7 return null;
8 }
9}.execute();
10}

Aber es stürzt mir immer ab?!

Antworten
  • Forum-Beiträge: 1.793

04.04.2013 10:10:00 via Website

Du brauchst eine eigene Klasse, die du von AsyncTask erben lässt. (
1public class MeinAT extends AsyncTask<Void, Void, Void> { ... }
)
Da machst du die doInBackgroundMethode rein ([code]
1public Void doInBackground(Void... params) {
2 [Code von Pascal P.]
3}
).
In der MainActivity startest du den AsyncTask, um die einzuloggen.
1//Einloggen
2AsyncTask login = new MeinAT();
3login.execute(new Void[0]);

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Gelöschter Account
  • Forum-Beiträge: 33

04.04.2013 10:41:52 via Website

Dankeschön!
Sieht ja nach deiner Beschreibung recht einfach aus :)
Werd es gleich mal testen

Antworten
Gelöschter Account
  • Forum-Beiträge: 33

04.04.2013 12:35:27 via Website

Eine Frage hätte ich noch an euch.
Und zwar hab ich ja den Inhalt der Seite in einem String gespeichert, aus dem ich den Inhalt zwischen den Tags benötige.
Diesen Inhalt will ich in einer XMl-Datei speichern und später wieder laden um daraus dann den Stundenplan darzustellen.
Jetzt habe ich von Html-Parsern gelesen und frage mich ob es nicht die Möglichkeit gibt, darüber an den Inhalt der Tags zu kommen und sie dann in der XML zu speichern und später wieder auszulesen. Ich weiß jetzt nicht ob ich das deutlich genug beschrieben habe. Mir stellt sich halt nur die Frage ob es nicht umständlich ist, den Inhalt zwischen den Tags zum Beispiel erst zu RegExen und dann so in eine XML-Datei zu speichern?

Antworten
  • Forum-Beiträge: 1.793

04.04.2013 12:46:18 via Website

HTMLParser sollten eine bessere Alternative darstellen, als Regular Expression, sofern sie denn funktionieren. XML ist eine gute Idee, um den Stundenplan offline anzusehen, bei der Datenmenge, denke ich ist das einfacher als eine Datenbank.
Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Gelöschter Account
  • Forum-Beiträge: 33

04.04.2013 13:49:14 via Website

Hast du eine Empfehlung welcher Parser da am geeignetsen wäre oder ist das im Grunde egal?

— geändert am 04.04.2013 14:22:06

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.076

06.04.2013 09:09:53 via App

Es ist egal welchen du jetzt nimmst.
Die einen können halt mehr als die anderen.

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 33

06.04.2013 11:56:28 via Website

Nochmal danke für deinen Code :)
Dazu hätte ich noch eine Frage. Ich hab den Code ja jetzt in dem Asyntask. Nur wie bekomm ich den jetzt in meine MainActivity um den zum Beispiel
in einem TextView anzuzeigen?

Bzw. was mache ich falsch das mir die App immernoch um die Ohren fliegt?
Ich hab in meiner MainActivity einfach nur einen Button mit folgenden Code:
1AsyncTask login = new Seitenparser();
2 login.execute();

In meiner ZweitActivity steht:
1public class Seitenparser extends AsyncTask<String, Void, String> {
2
3
4
5 protected String doInBackground(String... params) {
6 // TODO Auto-generated method stub
7
8
9 String string="";
10 String benutzername = "username";
11 String passwort = "123455";
12 HttpClient client = new DefaultHttpClient(); // Http CLient anlegen
13
14 HttpGet httpget = new HttpGet("https://office.kis.uni-kl.de/views/pia/pia.asp?size=1680&u="+benutzername+"&p="+passwort+"&login=%3E+Login");
15
16 try {
17
18 HttpResponse response = client.execute(httpget);
19
20 BufferedReader rd = new BufferedReader
21 (new InputStreamReader(response.getEntity().getContent()));
22
23 String line = "";
24 String out = null;
25 while ((line = rd.readLine()) != null) {
26 out += line;
27 }
28 //String out ist die HTML der Anmeldepage
29
30
31 } catch (Exception e) {
32 // TODO Auto-generated catch block
33 e.printStackTrace();
34 }
35
36
37 HttpGet request = new HttpGet("urlToStundenplan");
38
39 try {
40 HttpResponse response = client.execute(request);
41 BufferedReader rd = new BufferedReader
42 (new InputStreamReader(response.getEntity().getContent()));
43
44 String line = "";
45 String out = null;
46 while ((line = rd.readLine()) != null) {
47 out += line;
48 }
49 string = out;
50 //HTMlParse(out); //Die ausgabe wird in einer externen Funktion geparst.
51 } catch (ClientProtocolException e) {
52 // TODO Auto-generated catch block
53 e.printStackTrace();
54 } catch (IOException e) {
55 // TODO Auto-generated catch block
56 e.printStackTrace();
57 }
58
59 return string;
60 }
61
62
63}

— geändert am 06.04.2013 12:47:40

Antworten
  • Forum-Beiträge: 1.793

06.04.2013 13:39:18 via App

Was sagt den das Logcat?
Bzw. über die Funktion publishProcess() in doInBackground kannst du die Methode onProgressUpdate im AsyncTask aufrufen. Diese ist dann Thread-Sicher und kann z.B. DeineMainActivity.eineMethode() aufrufen.

Gruß

Ps noch ein Bsp:
public class AT extends AsyncTask<Void, String, Void>
...
doInBackground(Void... p) {
...
publishProcess(htmlText);
}

void onProgtessUpdate(String... p) {
mActivity.methode(p[0]);
}

public AT(MainActivity a) {
this.mActivity = a;

— geändert am 06.04.2013 13:43:14

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten

Empfohlene Artikel