OpenWeatherMap's weather API is simple, clear and free. This Android example show how access current weather data using OpenWeatherMap's weather API; for any location on Earth including over 200,000 cities! Current weather is frequently updated based on global models and data from more than 40,000 weather stations. Data is available in JSON, XML, or HTML format. This example use JSON.
To access the API you need to sign up for an API key, this example use the demo API Key (appid in the query)
MainActivity.java
package com.blogspot.android_er.androidopenweathermap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
public class MainActivity extends AppCompatActivity {
EditText editTextCityName;
Button btnByCityName;
TextView textViewResult, textViewInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextCityName = (EditText)findViewById(R.id.cityname);
btnByCityName = (Button)findViewById(R.id.bycityname);
textViewResult = (TextView)findViewById(R.id.result);
textViewInfo = (TextView)findViewById(R.id.info);
btnByCityName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new OpenWeatherMapTask(
editTextCityName.getText().toString(),
textViewResult).execute();
}
});
}
private class OpenWeatherMapTask extends AsyncTask<Void, Void, String> {
String cityName;
TextView tvResult;
String dummyAppid = "bd82977b86bf27fb59a04b61b657fb6f";
String queryWeather = "http://api.openweathermap.org/data/2.5/weather?q=";
String queryDummyKey = "&appid=" + dummyAppid;
OpenWeatherMapTask(String cityName, TextView tvResult){
this.cityName = cityName;
this.tvResult = tvResult;
}
@Override
protected String doInBackground(Void... params) {
String result = "";
String queryReturn;
String query = null;
try {
query = queryWeather + URLEncoder.encode(cityName, "UTF-8") + queryDummyKey;
queryReturn = sendQuery(query);
result += ParseJSON(queryReturn);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
queryReturn = e.getMessage();
} catch (IOException e) {
e.printStackTrace();
queryReturn = e.getMessage();
}
final String finalQueryReturn = query + "\n\n" + queryReturn;
runOnUiThread(new Runnable() {
@Override
public void run() {
textViewInfo.setText(finalQueryReturn);
}
});
return result;
}
@Override
protected void onPostExecute(String s) {
tvResult.setText(s);
}
private String sendQuery(String query) throws IOException {
String result = "";
URL searchURL = new URL(query);
HttpURLConnection httpURLConnection = (HttpURLConnection)searchURL.openConnection();
if(httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK){
InputStreamReader inputStreamReader = new InputStreamReader(httpURLConnection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader,
8192);
String line = null;
while((line = bufferedReader.readLine()) != null){
result += line;
}
bufferedReader.close();
}
return result;
}
private String ParseJSON(String json){
String jsonResult = "";
try {
JSONObject JsonObject = new JSONObject(json);
String cod = jsonHelperGetString(JsonObject, "cod");
if(cod != null){
if(cod.equals("200")){
jsonResult += jsonHelperGetString(JsonObject, "name") + "\n";
JSONObject sys = jsonHelperGetJSONObject(JsonObject, "sys");
if(sys != null){
jsonResult += jsonHelperGetString(sys, "country") + "\n";
}
jsonResult += "\n";
JSONObject coord = jsonHelperGetJSONObject(JsonObject, "coord");
if(coord != null){
String lon = jsonHelperGetString(coord, "lon");
String lat = jsonHelperGetString(coord, "lat");
jsonResult += "lon: " + lon + "\n";
jsonResult += "lat: " + lat + "\n";
}
jsonResult += "\n";
JSONArray weather = jsonHelperGetJSONArray(JsonObject, "weather");
if(weather != null){
for(int i=0; i<weather.length(); i++){
JSONObject thisWeather = weather.getJSONObject(i);
jsonResult += "weather " + i + ":\n";
jsonResult += "id: " + jsonHelperGetString(thisWeather, "id") + "\n";
jsonResult += jsonHelperGetString(thisWeather, "main") + "\n";
jsonResult += jsonHelperGetString(thisWeather, "description") + "\n";
jsonResult += "\n";
}
}
JSONObject main = jsonHelperGetJSONObject(JsonObject, "main");
if(main != null){
jsonResult += "temp: " + jsonHelperGetString(main, "temp") + "\n";
jsonResult += "pressure: " + jsonHelperGetString(main, "pressure") + "\n";
jsonResult += "humidity: " + jsonHelperGetString(main, "humidity") + "\n";
jsonResult += "temp_min: " + jsonHelperGetString(main, "temp_min") + "\n";
jsonResult += "temp_max: " + jsonHelperGetString(main, "temp_max") + "\n";
jsonResult += "sea_level: " + jsonHelperGetString(main, "sea_level") + "\n";
jsonResult += "grnd_level: " + jsonHelperGetString(main, "grnd_level") + "\n";
jsonResult += "\n";
}
jsonResult += "visibility: " + jsonHelperGetString(JsonObject, "visibility") + "\n";
jsonResult += "\n";
JSONObject wind = jsonHelperGetJSONObject(JsonObject, "wind");
if(wind != null){
jsonResult += "wind:\n";
jsonResult += "speed: " + jsonHelperGetString(wind, "speed") + "\n";
jsonResult += "deg: " + jsonHelperGetString(wind, "deg") + "\n";
jsonResult += "\n";
}
//...incompleted
}else if(cod.equals("404")){
String message = jsonHelperGetString(JsonObject, "message");
jsonResult += "cod 404: " + message;
}
}else{
jsonResult += "cod == null\n";
}
} catch (JSONException e) {
e.printStackTrace();
jsonResult += e.getMessage();
}
return jsonResult;
}
private String jsonHelperGetString(JSONObject obj, String k){
String v = null;
try {
v = obj.getString(k);
} catch (JSONException e) {
e.printStackTrace();
}
return v;
}
private JSONObject jsonHelperGetJSONObject(JSONObject obj, String k){
JSONObject o = null;
try {
o = obj.getJSONObject(k);
} catch (JSONException e) {
e.printStackTrace();
}
return o;
}
private JSONArray jsonHelperGetJSONArray(JSONObject obj, String k){
JSONArray a = null;
try {
a = obj.getJSONArray(k);
} catch (JSONException e) {
e.printStackTrace();
}
return a;
}
}
}
layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:autoLink="web"
android:text="http://android-er.blogspot.com/"
android:textStyle="bold" />
<EditText
android:id="@+id/cityname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="City name"/>
<Button
android:id="@+id/bycityname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Call current weather by city name"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ScrollView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:id="@+id/result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
android:textStyle="bold"/>
</ScrollView>
<ScrollView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:id="@+id/info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18dp"
android:textStyle="italic"/>
</ScrollView>
</LinearLayout>
</LinearLayout>
Permission of "android.permission.INTERNET" is needed in AndroidManifest.xml.
<uses-permission android:name="android.permission.INTERNET"/>
Download the files (Android Studio Format) .
How to display the data separately. For example.
ReplyDeleteIf i want to display wind speed on a textview
description on another
current temperature on another
Your code is not flexible.
Awsome tutorial.... thank you so much
ReplyDelete