# Suche eine Webseite mit dem aktuelle Datum in XML



## Meri (21. Nov 2016)

Hallo zusammen, 
ich bin verzweifelt dran in einer Android App das aktuelle Datum zu ermitteln und zwar nicht das System Datum, sondern von einer Webseite z.b. in XML.
Das System Datum kann ich nicht nehmen, da mir damit sonst der Benutzer über das umstellen des Datums, diesen Wert manipulieren kann, deshalb brauche ich sie aus dem Internet z.b. von einer Webseite, welche mir das Aktuelle Datum im XML-Format zur verfügung stellt. 
Vorgestellt habe ich es mir entweder so das ich das XML einer Seite runterlade, welches das Datum enthält, und dieses dann Parse und daraus dann somit das Datum auslese, aber dazu finde ich keine Seite, welche mir das so zur Verfügung stellt. Erst dachte ich mit folgende wäre es eine Option (http://exslt.org/date/functions/date-time/index.html), aber dort finde ich das Datum leider doch nicht.
Alternativ hab ich es über einen NTPServer versucht es mir abzufragen, mit folgendem Code:

```
SntpClient client = new SntpClient();
if (client.requestTime("time.foo.com")) {
    long now = client.getNtpTime() + SystemClock.elapsedRealtime() -
    client.getNtpTimeReference();
    Date current = new Date(now);
    Log.i("NTP tag", current.toString());
}
```
von diesem Beitrag:
http://stackoverflow.com/questions/16787240/android-getting-the-date-and-time-from-a-ntp-server

Aber auch das hat leider nicht klappt da zum einen der angegebene NTPServer nicht funktioniert aber auch mit anderen es nicht klappt.

Kann mir hierzu irgendjemand weiterhelfen? 
Das wäre sehr super wenn sich jemand kurz zeit dazu nehmen würde mir zu helfen!


----------



## Thallius (21. Nov 2016)

Ich denke dein Konzept ist Quatsch.

Wahrscheinlich willst du über das Datum eine Testphase abfragen oder sowas. Dazu brauchst du nicht das aktuelle Datum. Oder sagen wir so: das aktuelle Datum hilft dir auch nicht.

Schreib doch einfach bei jedem Start das aktuelle Datum in eine Datei (natürlich verschlüsselt) da kann der User dann das System Datum zurück setzen wie er lustig ist. Wenn das Datum in deiner Datei größer ist als das System Datum, dann hat er gefuscht und deine Software startet nicht.

Allerdings rettet dich das nicht davor, dass der User deine App einfach komplett löscht und neu installiert. Das würde es eben aber auch nicht wenn du das Datum aus dem Internet holst.

Gruß

Claus


----------



## Meri (22. Nov 2016)

Thallius hat gesagt.:


> Schreib doch einfach bei jedem Start das aktuelle Datum in eine Datei (natürlich verschlüsselt) da kann der User dann das System Datum zurück setzen wie er lustig ist. Wenn das Datum in deiner Datei größer ist als das System Datum, dann hat er gefuscht und deine Software startet nicht.


Das klingt schon gut, aber wie bekomme ich das aktuelle Datum raus wen nicht vom System? 

Und nein es handelt sich nicht um irgendwelche Testphasen sondern einen Adventakalender,  bei dem verhindert werden soll das das Türchen von morgen geöffnet wird. 

Deshalb die Frage wie umgehe ich das es der User einfach mit dem umstellen seiner Uhr austriksen kann?


----------



## Meri (24. Nov 2016)

Thallius hat gesagt.:


> aktuelle Datum in eine Datei


Welches meinst du damit und wie rufst du das ab? Ich habe nur das System Datum gefunden, welches ich abrufen kann.

Magst du mir das noch verraten, das wäre sehr super.

Vielen Dank schon mal im Vorraus.


----------



## Joose (24. Nov 2016)

http://www.timeapi.org/


----------



## Thallius (24. Nov 2016)

Wenn du verhindern willst, dass die Uhrzeit in die Zukunft geändert wird, dann funktioniert mein System natürlich nicht. Sorry

Claus


----------



## Meri (24. Nov 2016)

Joose hat gesagt.:


> http://www.timeapi.org/



kann ich mit der API informationen von der app aus im internet abrufen oder ist das ein extra Tool/Programm welches ich noch installieren müsste auf dem Gerät um die Zeit raus zu bekommen?
Hab es mir zwar angeschaut, aber komm damit noch nicht so ganz klar. Hast du mir da evtl. ein Beispiel wie ich das verwenden kann?




Thallius hat gesagt.:


> Wenn du verhindern willst, dass die Uhrzeit in die Zukunft geändert wird, dann funktioniert mein System natürlich nicht. Sorry
> 
> Claus


Trozdem Danke, dass du versucht hast mit weiter zu helfen.


----------



## InfectedBytes (24. Nov 2016)

Meri hat gesagt.:


> kann ich mit der API informationen von der app aus im internet abrufen oder ist das ein extra Tool/Programm welches ich noch installieren müsste auf dem Gerät um die Zeit raus zu bekommen?
> Hab es mir zwar angeschaut, aber komm damit noch nicht so ganz klar. Hast du mir da evtl. ein Beispiel wie ich das verwenden kann?


Du musst nichts weiter tun als die Webseite aufzurufen. Für utc z.b.: http://www.timeapi.org/utc/now


----------



## Meri (24. Nov 2016)

InfectedBytes hat gesagt.:


> Du musst nichts weiter tun als die Webseite aufzurufen. Für utc z.b.: http://www.timeapi.org/utc/now



oh ok ja vielen dank erst mal das klingt schon gut, nur wie baue ich das in eine app(welche in Java programiert ist in Android Studio) ein, so das ich auch den rückgabe wert dan speichern kann?


----------



## Joose (24. Nov 2016)

Meri hat gesagt.:


> ...... nur wie baue ich das in eine app(welche in Java programiert ist in Android Studio) ein, so das ich auch den rückgabe wert dan speichern kann?



http://stackoverflow.com/questions/3913502/restful-call-in-java


----------



## InfectedBytes (24. Nov 2016)

Erstmal brauchst du natürlich die Internet permission im manifest, ansonsten musst du aus Code Sicht einfach nur die Seite runterladen, z.B. mit der HttpClient Klasse


----------



## Meri (24. Nov 2016)

InfectedBytes hat gesagt.:


> Erstmal brauchst du natürlich die Internet permission im manifest, ansonsten musst du aus Code Sicht einfach nur die Seite runterladen, z.B. mit der HttpClient Klasse



Ok ja die Internet permission habe ich schon und das andere werde ich so mal ausprobieren.


Danke für die Hilfe schonmal euch!


----------



## Meri (24. Nov 2016)

Also ich hab das jetzt versucht mit dem

```
HttpClient client = new DefaultHttpClient();
```
aber das klappt leider noch nicht und bei der Recherche danach stoß ich auf die Info das es erst ab SDK 8 geht, welche es aber für Android noch garnicht gibt, sondern erst bis 7.1.

Hat jemand noch eien andere lösung diese HTTP anfrage zu machen bei einer App, ab besten solte es bei Android 4.1 schon umsetzbar sein.


----------



## InfectedBytes (24. Nov 2016)

Meri hat gesagt.:


> Also ich hab das jetzt versucht mit dem
> 
> ```
> HttpClient client = new DefaultHttpClient();
> ...


Das gibt es seit API Version 1...
https://developer.android.com/reference/org/apache/http/client/HttpClient.html

edit:
Schreib am besten mal was du denn versucht hast


----------



## Meri (24. Nov 2016)

also mit der HttpClient klasse hat es garnicht funktioniert schon nur die zeile
HttpClient client = new DefaultHttpClient(); in den code einzufügen ging nicht, also verlangte nach dem ich den "insert API indexing api code " hinzugefügt hab, nach einer höheren API.
Und das wäre der ganze code mit welchem ich mit der Zeile noch weiter machen wolte, wenn es geklappt hatte:

```
HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet("http://www.test.com");
        HttpResponse response = client.execute(request);

// Get the response
        BufferedReader bufferedReader = new BufferedReader
                (new InputStreamReader(
                        response.getEntity().getContent()));

        String line = "";
        while ((line = bufferedReader.readLine()) != null) {
            textView.append(line);
        }
    }catch (Exception e)
    {
        e.toString();
    }
```
Er lasst mich nicht mal folgenden import machen:

import org.apache.http.client.HttpClient;
import org.apache.http.HttpResponse;

Und dann hab ich jetzt noch mit einer anderen alternative es probiert

```
HttpURLConnection httpURLConnection = null;
        BufferedReader bufferedReader = null;

        String daten = "";

        try {
            URL url = new URL( "http://www.timeapi.org/utc/now");

             httpURLConnection = (HttpURLConnection) url.openConnection();

            InputStream inputStream = httpURLConnection.getInputStream();

            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

           daten =
bufferedReader.readLine();
```
welche aber auch noch nicht will also bei dem inputStream eine fehlermeldung bringt, und zwar folgende:
android.os.NetworkOnMainThreadException


----------



## Thallius (24. Nov 2016)

Sagt doch alles.


----------



## Meri (24. Nov 2016)

Thallius hat gesagt.:


> Sagt doch alles.


ok aber ich komm leider nicht drauf wie ich es lösen kann, oder was es mir indemfall sagen soll.
kanst du mir einen tip geben wo mein fehler liegt bzw. wie ich diesen beheben kann?
das wäre voll super.


----------



## InfectedBytes (24. Nov 2016)

Auch wenn man keine Ahnung von einer Fehlermeldung hat, ist der erste Schritt diese zu googlen und schon weiß man was los ist und wie man es beheben kann.

Hier trotzdem mal die Kurzfassung:
Daten innerhalb des UI threads runterzuladen ist eine ziemlich dumme Idee, da dadurch die UI für die Dauer des Downloads einfriert. Um dem vorzubeugen erlaubt Android es einfach nicht und wirft eine Exception. 
Lösung: Den Download einfach in einem separaten Thread durchführen


----------



## Meri (24. Nov 2016)

Ich hatte es bereits gegoogelt aber nicht wirklich was gefunden. 
Danke das du mir doch noch ein Tipp gegeben hast.
Ich werde es morgen ausprobieren.


----------

