Hallo,
ich habe mich gerade durch die Verwendung der TimeZone API bei Google gequält.
Hier waren für mich viele neue Komponenten, wie AsyncTask, HttpURLConnection, JSONObject und eben die Google TimeZone API enthalten.
Den Krampf möchte ich jedem Newbe ersparen und deshalb hier mein Code.
Also Ziel ist es anhand einer Koordinate und der aktuellen Zeit für diese Position z.B. die Zeitzone oder eine aktuelle Zeitverschiebung wegen Sommerzeit zu erfragen.
Google bietet hierzu die Nutzung der API unter Verwendung eines Schlüssels an, mit dem die Nutzung des Features kontrolliert werden kann. Wird der Schlüssel nicht verwendet, was problemlos möglich ist, dann ist der Nutzer IP basiert auf 2500 Zugriffe beschränkt. Ansonsten ist er App basiert auf 2500 Zugriffe beschränkt.
Die Dokumentation zur TimeZone API findet sich hier: Google TimeZone API
Der Schlüssel kann wie bei Google Maps über die API Console als Server Key erzeugt werden: API Console
Dann hier die Anfrage, z.B. in einem onClick Event:
double latitude = 50.0; // eure geografische Breite
double longitude = 7.0; // eure geografische Länge
long timestamp = System.currentTimeMillis() / 1000; // die aktuelle Systemzeit in Sekunden
String key = "euer Schlüssel aus der API";
ConnectivityManager connectMngr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectMngr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
new TimeZoneAPITask().execute("https://maps.googleapis.com/maps/api/timezone/json?location=" + latitude + "," + longitude + "×tamp=" + timestamp + "&sensor=false&key" + key);
} else {
Toast.makeText(getApplicationContext(), "Keine Netzwerkverbindung vorhanden.", Toast.LENGTH_SHORT).show();
}
Alles anzeigen
Hier die AsyncTask mit der TimeZone-ID als Ergebnis:
private class TimeZoneAPITask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
try {
return downloadJSON(urls[0]);
} catch (IOException e) {
return "Es können keine Daten empfangen werden. Eventuell ist die URL inkorrekt.";
}
}
@Override
protected void onPostExecute(String result) {
try {
JSONObject jObject = new JSONObject(result);
// hier das gewüschte Resultat!
String aJsonString = jObject.getString("timeZoneId");
Toast.makeText(getApplicationContext(), aJsonString, Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
// TODO Auto-generated method stub
}
}
}
Alles anzeigen
Und der eigentliche Download, der für alles Mögliche benutzt werden kann:
private String downloadJSON(String googleAPIurl) throws IOException {
InputStream jsonInputStream = null;
try {
URL googleAPI = new URL(googleAPIurl);
HttpURLConnection googleConnection = (HttpURLConnection) googleAPI.openConnection();
googleConnection.setReadTimeout(10000); // Millisekunden
googleConnection.setConnectTimeout(15000); // Millisekunden
googleConnection.setRequestMethod("GET");
googleConnection.setDoInput(true);
googleConnection.connect();
jsonInputStream = googleConnection.getInputStream();
BufferedReader streamReader = new BufferedReader(new InputStreamReader(jsonInputStream));
StringBuilder contentAsString = new StringBuilder();
String line = null;
while ((line = streamReader.readLine()) != null) {
contentAsString.append(line + System.getProperty("line.separator"));
}
streamReader.close();
return contentAsString.toString();
} finally {
if (jsonInputStream != null) {
jsonInputStream.close();
}
}
}
Alles anzeigen
Ich hoffe das hilft dem Einen oder Anderen!