Programmieren einer Vertretungsplan-App(Schule)

  • Antworten:40
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 293

22.02.2017, 10:17:21 via App

Sry bin einfach nicht hinter das mit dem WebClient gekommen!
Klar den Code will ich ja auch selbst verstehen und auch programmiere!

Ist es kein iPhone... Ist es ein Android !!!

Samsung Galaxy S7 edge ; SM-G935F ; Android 7.0
Samsung Gear S2 classic
Samsung Galaxy Note 7 ; SM-N930F ; Android 6.0.1 ; R.I.P

Antworten
  • Forum-Beiträge: 293

27.02.2017, 16:26:24 via Website

Der richtige Html Code wird jetzt ausgegeben, nur anstatt des Inhaltes wird im Body folgendes angezeigt:

I/System.out:
I/System.out: Your browser might not be supported by WebUntis - click here for further information!

— geändert am 27.02.2017, 17:14:30

Ist es kein iPhone... Ist es ein Android !!!

Samsung Galaxy S7 edge ; SM-G935F ; Android 7.0
Samsung Gear S2 classic
Samsung Galaxy Note 7 ; SM-N930F ; Android 6.0.1 ; R.I.P

Antworten
  • Forum-Beiträge: 293

27.02.2017, 17:18:54 via Website

Mein Fehler ! Der oben beschrieben Teil wird immer angezeigt :D

Nur leider fehlen die Tabellen, wenn ich die Website in Chrome untersuche wird mir der Code angezeigt den ich im Android Studio brauche!! Wenn ich jedoch nur den Quellcode anzeigen lasse kann ich den Teil mit der Tabelle nicht sehen, so wie auch im Android Studio :/

Ist es kein iPhone... Ist es ein Android !!!

Samsung Galaxy S7 edge ; SM-G935F ; Android 7.0
Samsung Gear S2 classic
Samsung Galaxy Note 7 ; SM-N930F ; Android 6.0.1 ; R.I.P

Antworten
  • Forum-Beiträge: 434

02.03.2017, 13:09:41 via Website

Was spricht dagegen einfach die .html-Datei auszulesen (AsyncTask) und dann im Callback die Infos aus der Html auf dem Handy in sinnvollerweise zu filtern (Schüler gibt Filter vor für zB "Raum", "Lehrer", etc) und dann in einer RecyclerView (ggf. ListView) darzustellen?
WebViews...? bahh! :D

Open Source

Antworten
  • Forum-Beiträge: 293

02.03.2017, 13:14:33 via App

Ich möchte den Plan ja auch in einem ListView einfügen!! Doch der Quellcode für die generierte Tabelle lässt sich nur durch den Dom Explorer anzeigen. Also bringt es mir nichts wenn ich die .html Datei auslese!
Und genau da ist mein Problem, wie kann ich im Android Studio auf den Quellcode zugreifen, der nur durch den Dom Explorer sichbar wird :/

Ist es kein iPhone... Ist es ein Android !!!

Samsung Galaxy S7 edge ; SM-G935F ; Android 7.0
Samsung Gear S2 classic
Samsung Galaxy Note 7 ; SM-N930F ; Android 6.0.1 ; R.I.P

Antworten
  • Forum-Beiträge: 3.240

02.03.2017, 15:53:15 via Website

Was spricht dagegen einfach die .html-Datei auszulesen (AsyncTask) und dann im Callback die Infos aus der Html
... WebViews...? bahh!

Das hatte er bereits versucht, seine Seite wird allerdings (nach unbestimmter Zeit) nachgeladen.
(Siehe weiter oben die bereits angesetzten Lösungsmöglichkeiten)

Wenn WebView & WebViewClient nicht Deine Wahl wäre, was würdest du dann vorschlagen ?
(Async / Jsoup iss nich)
.

@Rick
Hast du denn jetzt mal ordentlich auf onPageLoaded gewartet und dir mal mit einem Script
den Source ausgelesen ? (Wie oben erklärt)

— geändert am 02.03.2017, 16:07:08

Liebe Grüße - Stefan
[ App - Entwicklung ]

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

02.03.2017, 16:04:51 via App

Async Jsoup und Javascript durcharbeiten bis man weiß nach welcher Logik die eigentliche Html nachgeladen wird. Kostet im normalfall allerdings 100x so viel Zeit wie über WebView....

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

swa00

Antworten
  • Forum-Beiträge: 293

02.03.2017, 16:11:45 via Website

Ja es hat auch alles funktioniert, nur fehlt er generiete Teil, welcher nur über den Dom Explorer sichtbar wird!

Hab es auch bereits so versucht ...

public class Tab1today extends Fragment {

public WebView vertretungtoday;

class MyJavaScriptInterface{
    @JavascriptInterface
    @SuppressWarnings("unused")
    public void  processHTML(String html){
        System.out.println(html);
    }

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.tab1_today, container, false);
    vertretungtoday = (WebView)rootView.findViewById(R.id.vertretungtodayview);
    WebSettings webSettings = vertretungtoday.getSettings();
    webSettings.setJavaScriptEnabled(true);
    vertretungtoday.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
    vertretungtoday.setWebViewClient(new WebViewClient(){
        @Override
        public void onPageFinished(WebView view, String url){
            super.onPageFinished(view, url);
            vertretungtoday.loadUrl("javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
        }
    });
    vertretungtoday.loadUrl("https://hepta.webuntis.com/WebUntis/monitor?school=kolbe-ges-saerbeck&monitorType=subst&format=Vertretung%20Klassen");
    return rootView;


}

}

— geändert am 02.03.2017, 16:16:35

Ist es kein iPhone... Ist es ein Android !!!

Samsung Galaxy S7 edge ; SM-G935F ; Android 7.0
Samsung Gear S2 classic
Samsung Galaxy Note 7 ; SM-N930F ; Android 6.0.1 ; R.I.P

Antworten
  • Forum-Beiträge: 3.240

02.03.2017, 16:16:07 via Website

Also nochmal, wir müssen es ja mal Nachvollziehen können. :-)

a) in deiner WebView wird dir ALLES angezeigt - richtig ?
b) Nach dem Script (Console) hast du einen String - richtig ?

Wie kommst du also darauf , dass in diesem String ein Teil fehlt ?
Hast du dir den mal z.b. in eine Datei weggeschrieben und geschaut , wieviel wirklich da ist ?

In AS kannst du nicht alles sehen (z.b. beim Debuggen)

— geändert am 02.03.2017, 16:16:29

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 293

02.03.2017, 16:26:24 via Website

Ich merke dass es umfangreicher wird als ich dachte :D Was kann ich da jetzt machen?? Ich stehe irgendwie auf dem Schlauch (thinking)

— geändert am 02.03.2017, 16:30:21

Ist es kein iPhone... Ist es ein Android !!!

Samsung Galaxy S7 edge ; SM-G935F ; Android 7.0
Samsung Gear S2 classic
Samsung Galaxy Note 7 ; SM-N930F ; Android 6.0.1 ; R.I.P

Antworten
  • Forum-Beiträge: 3.240

02.03.2017, 16:32:13 via Website

Ich merke dass es umfangreicher wird als ich dachte

Na ja , das was du vorhast ist halt Tricky und erfordert schon eine Portion Praxiserfahrung.

Wir geben uns ja auch hier die Mühe , DIch auf den richtigen Pfad zu bekommen , aber
umsetzen können wir dir das leider nicht.

Fakt ist , nachdem die Seite geladen ist , musst du den String parsen.
Und jetzt stellen wir eben noch fest , dass deine Tabelle ein Json String ist.

Also musst du dir jetzt den Anfang ermitteln, mit Json parsen und dann daraus deine "Datensätze" ermitteln.
Ab da biste dann in der Lage die in dein ListView /RecycleView/Tabelle einzufügen .

P.S dazu solltest du gleich einen CustomAdapter benutzen , weil du sehrwahrscheinlich mehrspaltig fährst.

— geändert am 02.03.2017, 16:38:05

Liebe Grüße - Stefan
[ App - Entwicklung ]

pepperonas

Antworten
  • Forum-Beiträge: 434

03.03.2017, 08:01:35 via Website

swa00

Also musst du dir jetzt den Anfang ermitteln, mit Json parsen und dann daraus deine "Datensätze" ermitteln.
Ab da biste dann in der Lage die in dein ListView /RecycleView/Tabelle einzufügen .

P.S dazu solltest du gleich einen CustomAdapter benutzen , weil du sehrwahrscheinlich mehrspaltig fährst.

Eben :D

Rick A.

Ich merke dass es umfangreicher wird als ich dachte :D Was kann ich da jetzt machen?? Ich stehe irgendwie auf dem Schlauch (thinking)

jo, ist ein bisschen Geduld gefragt, aber die lohnt es sich zu investieren. Endergebnis wird um Welten besser und du lernst was (das sogar nicht zu knapp) ;)

Vorgehensweise:
- AsyncTask verstehen und implementieren können (Grund: du darfst nicht vom MainUi-Thread laden da er blockieren würde.. Also musst die Daten aus dem Hintergrund(Thread) beziehen -> das macht der AsyncTask)
- dabei mit sinnvollen Log.d("...","..............")-Statments den Code prüfen ob alles auch so abläuft wie gedacht
- wenn die Daten bei dir auf dem Handy eintrudeln, wird dich hier bestimmt keiner hängen lassen :)

PS: Falls das Tutorial nix ist, nimm das.

— geändert am 03.03.2017, 08:05:06

Open Source

Antworten
  • Forum-Beiträge: 293

08.06.2017, 21:09:04 via Website

So nach viel Klausur Stress bin ich auch wieder am Start! Mittlerweile hat die Schule einen Zugang für die App von Untis veröffentlicht und nun hab ich versucht den Quellcode von der Seite auszulesen und hab folgendes raus bekommen. Kann ich damit was anfangen?

https://www.dropbox.com/s/yzovq7g8lygoq51/url.txt?dl=0

Ist es kein iPhone... Ist es ein Android !!!

Samsung Galaxy S7 edge ; SM-G935F ; Android 7.0
Samsung Gear S2 classic
Samsung Galaxy Note 7 ; SM-N930F ; Android 6.0.1 ; R.I.P

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

08.06.2017, 21:12:34 via Website

Nicht wirklich...

Du solltest das ganze erst mal am Browser am PC versichen bevor du in de App damit anfängst. Das erspart die zeit, da du dann weißt was die Webseite so alles hergibt.

Falls du interesse hast, kannst du mir gerne den Zugang+Url per PN schicken und ich schau mir das mal selber an. Nur dann kann ich dir sagen obs so geht..

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

Antworten
  • Forum-Beiträge: 293

09.06.2017, 16:45:01 via Website

Vielen Dank für deine Hilfe!

Hab dir die Daten per Mail geschickt.

Ist es kein iPhone... Ist es ein Android !!!

Samsung Galaxy S7 edge ; SM-G935F ; Android 7.0
Samsung Gear S2 classic
Samsung Galaxy Note 7 ; SM-N930F ; Android 6.0.1 ; R.I.P

Pascal P.

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

09.06.2017, 21:39:26 via Website

Hey Rick,
ich hab mir das ganze gerade mal angeschaut.

Also so wie ich das sehe, ist das lesen der Webseite durch eine WebView und das anschließende parsen hier viel zu aufwändig.

Daher hast du glück, dass die Seite moderne standards verwendet und im Hintergrund eine API läuft die dir die Daten per JSON liefert.
D.h. du musst in deiner App nur die Session erstellen (Ein http Post mit den Benutzerdaten und dann den Sessioncookie auswerten.)

Anschließend kannst du deine Request senden und das zurückgegebene Json auswerten und darstellen.
Für HTTP Requst + Json Parser nimmst du am besten ION mit Gson ;)

Und damit du weißt, was du überhaupt für einen Request schicken musst, musst du die Seite analysieren, das diese im JQuery/Javascript treibt. Ich benutze dafür FF + Firebug.

Für dich wären dann Requests interessant, welche auf diese URL gehen:
https://hepta.webuntis.com/WebUntis/Timetable.do?request.preventCache=1497036576237

Ach ja überlgege dir vorher ob sich der aufwand loht, denn deine Schule unterstützt jetzt auch die mobile Version:
https://play.google.com/store/apps/details?id=com.grupet.web.app&hl=de

Welche eigentlich genau das schon macht ;)

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

Rick A.swa00

Antworten
  • Forum-Beiträge: 293

19.06.2017, 17:24:44 via Website

Erstmal Danke für die vielen Infos!!! (cool)

Hab mich schon mal mit der Session auseinandergesetzt und folgendes Erreicht:

image

image

image

Ich komme nur noch nicht auf den Trichter, wie ich das ganze jetzt mit dem Login der Website verknüpfe ??? (thinking)

Ist es kein iPhone... Ist es ein Android !!!

Samsung Galaxy S7 edge ; SM-G935F ; Android 7.0
Samsung Gear S2 classic
Samsung Galaxy Note 7 ; SM-N930F ; Android 6.0.1 ; R.I.P

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

19.06.2017, 17:33:40 via Website

Das ist jetzt nich so einfach.

Zuerst brauchst du den SessionCookie, da kann ich dir eine Lib von Ludy empfehlen:
https://github.com/Ludy87/Session_Cookie_Reader

Sobald du denn den SessionCookie hast (für die URL und die Parameter kannst du mit Firefox und Firebug) die Post Url und die Felder für den login herausbekommen).

Dann kannst du mit ION deine Requests absetzen, z.b.
Ion.with(this).load(url).setHeader("JSESSIONID","deinCookieId").asJson().setCallback(...);

Im Callback bekommst du dann deine Anwort als jsonObjekt.
Diese kannst du dann verarbeiten und/oder in eigene java Objekte laden.

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

swa00

Antworten