Search code examples
androidopenweathermap

OpenWeatherMap Icon download android


I am working on an android app that uses a weather service. I am currently using the API from openweathermap.org and I noticed that in the response there is also an icon tag and I was wondering how do you actually get this image to show. I have tried to fiddle around with it but I cannot seem to figure it out.

This is my Main Activity:

public class MainActivity extends Activity {

String description;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
    super.onStart();

    Double lat =  55.676098;

    Double lon = 12.568337;

    String apiKey = "70c5bf4e84a725a8aeb3dd8c7df4c254";
    String urlAPI = "http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "&APPID=" + apiKey;
    String imgURL = "http://openweathermap.org/img/w/" + description + ".png";
    Weather weatherApi = new Weather();
    weatherApi.execute(urlAPI);
    weatherApi.execute(imgURL);


}
public void goToShowFishActivity(View view) {

    Intent intent = new Intent(this, ShowFishiesActivity.class);
    startActivity(intent);

}

public void goToAddNewCatchActivity(View view) {
    Intent intent = new Intent(this, AddCatch.class);
    startActivity(intent);
}

public void goToLogin(View view) {
    Intent intent = new Intent(this, CreateUserActivity.class);
    startActivity(intent);
}

private class Weather extends ReadHttpTask{
    @Override
    protected void onPostExecute(CharSequence charSequence){

        String text = charSequence.toString();
        Integer start = text.indexOf("icon\":\"" ) + "icon\":\"".length();
        Integer end = text.indexOf("\"}",start);
        description = text.substring(start, end);


        TextView weatherTry = (TextView) findViewById(R.id.weatherTry);
        weatherTry.setText(description);


     }
  }

}

My ReadHttpTask class:

public class ReadHttpTask extends AsyncTask<String, Void, CharSequence> {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
protected CharSequence doInBackground(String...urls) {
    String urlString = urls[0];
    try{
        CharSequence result = HttpHelper.GetHttpResponse(urlString);
        return result;
    }
    catch (IOException ex){
        cancel(true);
        String errorMessage = ex.getMessage() + "\n" + urlString;
        Log.e("Something went wrong", errorMessage);
        return errorMessage;
    }
  }
}

And my HttpHelper class:

public class HttpHelper {

@RequiresApi(api = Build.VERSION_CODES.N)
public static CharSequence GetHttpResponse(String urlString) throws IOException {
    URL url = new URL(urlString);
    URLConnection connection = url.openConnection();
    if (!(connection instanceof HttpURLConnection)) {
        throw new IOException("Not an HTTP connection");
    }

    HttpURLConnection httpConnection = (HttpURLConnection) connection;
    int responseCode = httpConnection.getResponseCode();
    if (responseCode != HttpURLConnection.HTTP_OK) {
        String responseMessage = httpConnection.getResponseMessage();
        throw new IOException("HTTP response code: " + responseCode + " " + responseMessage);

    }
    InputStream inputStream = httpConnection.getInputStream();
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        StringBuilder sb = new StringBuilder();
        while (true) {
            line = reader.readLine();
            if (line == null) break;
            sb.append(line);
        }
        return sb;
    } finally {
        if (reader != null) reader.close();
    }
  }
}

Solution

  • The icon value you get in the json, like, 09d or 50d is the icon code. To get the icon you need to create a url such as: http://openweathermap.org/img/w/09d.png.

    I suggest you store the icon code as a string and use Picasso to actually display the icon.

    String icon = yourJsonObject.getString("icon");
    String iconUrl = "http://openweathermap.org/img/w/" + icon + ".png";
    
    Picasso.with(context).load(iconUrl).into(yourImageView);