Problem Obtaining Data from the OpenWeatherMap Android Service

0

Good morning,

I have not yet been able to get this little app working, and now there is no value in either temperature or humidity or wind.

I think the problem is in my implementation of the object which afterwards can not be loaded with the values received from the service ...

MainActivity:

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

private static final String APP_ID = "api_id";

private static final int PERMISSION_ACCESS_COARSE_LOCATION = 1;
private GoogleApiClient googleApiClient;

private TextView textView;
private TextView textView_humidity;


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

    textView = (TextView) findViewById(R.id.textView);

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_COARSE_LOCATION },
                PERMISSION_ACCESS_COARSE_LOCATION);
    }

    googleApiClient = new GoogleApiClient.Builder(this, this, this).addApi(LocationServices.API).build();
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_ACCESS_COARSE_LOCATION:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // All good!
            } else {
                Toast.makeText(this, "Need your location!", Toast.LENGTH_SHORT).show();
            }

            break;
    }
}

@Override
protected void onStart() {
    super.onStart();
    if (googleApiClient != null) {
        googleApiClient.connect();
    }
}

@Override
protected void onStop() {
    googleApiClient.disconnect();
    super.onStop();
}

@Override
public void onConnected(Bundle bundle) {
    Log.i(MainActivity.class.getSimpleName(), "Connected to Google Play Services!");

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        Location lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

        double lat = lastLocation.getLatitude();
        double lon = lastLocation.getLongitude();

        String units = "metric";
        String url = String.format("http://api.openweathermap.org/data/2.5/weather?lat=%f&lon=%f&units=%s&appid=%s",
                lat, lon, units, APP_ID);
        new GetWeatherTask(textView).execute(url);
    }
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.i(MainActivity.class.getSimpleName(), "Can't connect to Google Play Services!");
}

private class GetWeatherTask extends AsyncTask<Meteo, Void, Meteo> {
    private TextView textView;
    private TextView textView_humidity;

    public GetWeatherTask(TextView textView) {
        this.textView = textView;
    }


    @Override
    protected Meteo doInBackground(Meteo... params) {
        Meteo meteo = new Meteo();
        String weather = "UNDEFINED";

        try {
            URL url = new URL(params[0]);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

            InputStream stream = new BufferedInputStream(urlConnection.getInputStream());
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));
            StringBuilder builder = new StringBuilder();

            String inputString;
            while ((inputString = bufferedReader.readLine()) != null) {
                builder.append(inputString);
            }


            JSONObject topLevel = new JSONObject(builder.toString());
            JSONObject main = topLevel.getJSONObject("main");
            meteo.temperatura = String.valueOf(main.getDouble("temp"));
            meteo.humidade = String.valueOf(main.getDouble("humidity"));

            urlConnection.disconnect();
        } catch (IOException | JSONException e) {
            e.printStackTrace();
        }
        return meteo;
    }

    @Override
    protected void onPostExecute(Meteo meteo) {
        textView.setText("Current Weather: " + meteo.temperatura + " ºC");
        textView.setText("Current Humidity: " + meteo.humidade + " ºC");
    }
}

}

Weather:

public class Meteo {

public String temperatura;
public String humidade;
public String vento;

public Meteo()
{
    temperatura = "";
    humidade = "";
    vento = "";
}

public Meteo(String tEmperatura, String hUmidade, String vEnto)
{
    temperatura = tEmperatura;
    humidade = hUmidade;
    vento = vEnto;
}

public String getTemperatura(){
    return temperatura;
}

public String getHumidade (){
    return humidade;
}

public String getVento()
{
    return vento;
}

}

I'm not seeing what I might be doing wrong, since I adapted this example to use the Meteo object and could return more than one parameter, because in the original example it only returned a String temperature.

Can anyone help me to understand and correct the situation?

    
asked by anonymous 01.12.2016 / 12:42

0 answers