如何通过谷歌天气API阅读天气数据

时间:2012-07-16 13:12:29

标签: android

我正在使用谷歌天气API为Android开发天气样本应用程序,到目前为止我已经开发了(你可以看到下图)

enter image description here

我有问题如何读取数据,如下面的红色矩形所示。现在我需要在源代码中进行哪些更改才能读取数据。

enter image description here

我的主要活动

 package org.anddev.android.weatherforecast;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.anddev.android.weatherforecast.views.SingleWeatherInfoView;
import org.anddev.android.weatherforecast.weather.GoogleWeatherHandler;
import org.anddev.android.weatherforecast.weather.WeatherCurrentCondition;
import org.anddev.android.weatherforecast.weather.WeatherForecastCondition;
import org.anddev.android.weatherforecast.weather.WeatherSet;
import org.anddev.android.weatherforecast.weather.WeatherUtils;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;

public class WeatherForecast extends Activity 
{

    private final String DEBUG_TAG = "WeatherForcaster";
    private CheckBox chk_usecelsius = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) 
    {
        super.onCreate(icicle);
        setContentView(R.layout.main);

        this.chk_usecelsius = (CheckBox) findViewById(R.id.chk_usecelsius);

        Button cmd_submit = (Button) findViewById(R.id.cmd_submit);

        cmd_submit.setOnClickListener(new OnClickListener() 
        {


            public void onClick(View arg0) 
            {
                URL url;
                try {
                    /* Get what user typed to the EditText. */
                    String cityParamString = ((EditText) findViewById(R.id.edit_input)).getText().toString();
                    String queryString = "http://www.google.com/ig/api?weather=Peshawar, Khyber Pakhtunkhwa";  //Lincoln,Nebraska
                    /* Replace blanks with HTML-Equivalent. */  
                    url = new URL(queryString.replace(" ", "%20"));

                    /* Get a SAXParser from the SAXPArserFactory. */
                    SAXParserFactory spf = SAXParserFactory.newInstance();
                    SAXParser sp = spf.newSAXParser();

                    /* Get the XMLReader of the SAXParser we created. */
                    XMLReader xr = sp.getXMLReader();

                    /*
                     * Create a new ContentHandler and apply it to the
                     * XML-Reader
                     */
                    GoogleWeatherHandler gwh = new GoogleWeatherHandler();
                    xr.setContentHandler(gwh);

                    /* Parse the xml-data our URL-call returned. */
                    xr.parse(new InputSource(url.openStream()));

                    /* Our Handler now provides the parsed weather-data to us. */
                    WeatherSet ws = gwh.getWeatherSet();

                    /* Update the SingleWeatherInfoView with the parsed data. */
                    updateWeatherInfoView(R.id.weather_today, ws.getWeatherCurrentCondition());

                    updateWeatherInfoView(R.id.weather_1, ws.getWeatherForecastConditions().get(0));
                    updateWeatherInfoView(R.id.weather_2, ws.getWeatherForecastConditions().get(1));
                    updateWeatherInfoView(R.id.weather_3, ws.getWeatherForecastConditions().get(2));
                    updateWeatherInfoView(R.id.weather_4, ws.getWeatherForecastConditions().get(3));

                } 
                catch (Exception e) 
                {
                    resetWeatherInfoViews();
                    Log.e(DEBUG_TAG, "WeatherQueryError", e);
                }
            }
        });
    }

    private void updateWeatherInfoView(int aResourceID,WeatherForecastCondition aWFIS) 

            throws MalformedURLException 
            {

        /* Construct the Image-URL. */
        URL imgURL = new URL("http://www.google.com" + aWFIS.getIconURL());
        ((SingleWeatherInfoView) findViewById(aResourceID)).setRemoteImage(imgURL);

        int tempMin = aWFIS.getTempMinCelsius();
        int tempMax = aWFIS.getTempMaxCelsius();

        /* Convert from Celsius to Fahrenheit if necessary. */
        if (this.chk_usecelsius.isChecked()) 
        {
            ((SingleWeatherInfoView) findViewById(aResourceID)).setTempCelciusMinMax(tempMin, tempMax);
        } 

        else 
        {
            tempMin = WeatherUtils.celsiusToFahrenheit(tempMin);
            tempMax = WeatherUtils.celsiusToFahrenheit(tempMax);
            ((SingleWeatherInfoView) findViewById(aResourceID)).setTempFahrenheitMinMax(tempMin, tempMax);
        }
    }

    private void updateWeatherInfoView(int aResourceID,
            WeatherCurrentCondition aWCIS) throws MalformedURLException 
            {

        /* Construct the Image-URL. */
        URL imgURL = new URL("http://www.google.com" + aWCIS.getIconURL());
        ((SingleWeatherInfoView) findViewById(aResourceID)).setRemoteImage(imgURL);

        /* Convert from Celsius to Fahrenheit if necessary. */
        if (this.chk_usecelsius.isChecked())
        {
            ((SingleWeatherInfoView) findViewById(aResourceID)).setTempCelcius(aWCIS.getTempCelcius());
        }

        else
        {
            ((SingleWeatherInfoView) findViewById(aResourceID)).setTempFahrenheit(aWCIS.getTempFahrenheit());
        }
    }

    private void resetWeatherInfoViews() 
    {
        ((SingleWeatherInfoView)findViewById(R.id.weather_today)).reset();
        ((SingleWeatherInfoView)findViewById(R.id.weather_1)).reset();
        ((SingleWeatherInfoView)findViewById(R.id.weather_2)).reset();
        ((SingleWeatherInfoView)findViewById(R.id.weather_3)).reset();
        ((SingleWeatherInfoView)findViewById(R.id.weather_4)).reset();
    }
}

天气信息视图活动

package org.anddev.android.weatherforecast.views;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Map;

import org.anddev.android.weatherforecast.R;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * The View capable of showing a WeatehrIcon + a Temperature-TextView.
 */
public class SingleWeatherInfoView extends LinearLayout {

    // ===========================================================
    // Fields
    // ===========================================================

    private ImageView myWeatherImageView = null;
    private TextView myTempTextView = null;

    // ===========================================================
    // Constructors
    // ===========================================================

    public SingleWeatherInfoView(Context context) 
    {
        super(context);
    }


    public SingleWeatherInfoView(Context context, AttributeSet attrs) //,Map inflateParams
    {
        super(context,attrs);
        /* Setup the ImageView that will show weather-icon. */
        this.myWeatherImageView = new ImageView(context);
        this.myWeatherImageView.setImageDrawable(getResources().getDrawable(R.drawable.dunno));

        /* Setup the textView that will show the temperature. */
        this.myTempTextView = new TextView(context);
        this.myTempTextView.setText("? °C");
        this.myTempTextView.setTextSize(16);
        this.myTempTextView.setTypeface(Typeface.create("Tahoma", Typeface.BOLD));


        /* Add child views to this object. */
        this.addView(this.myWeatherImageView, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        this.addView(this.myTempTextView, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    }

    // ===========================================================
    // Getter & Setter
    // ===========================================================

    public void reset() 
    {
        this.myWeatherImageView.setImageDrawable(getResources().getDrawable(R.drawable.dunno));
        this.myTempTextView.setText("? °C");
    }

    /** Sets the Child-ImageView of this to the URL passed. */
    public void setRemoteImage(URL aURL) 
    {
        try 
        {
            URLConnection conn = aURL.openConnection();
            conn.connect();
            InputStream is = conn.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            Bitmap bm = BitmapFactory.decodeStream(bis);
            bis.close();
            is.close();
            this.myWeatherImageView.setImageBitmap(bm);
        } 

        catch (IOException e) 
        {
            /* Reset to 'Dunno' on any error. */
            this.myWeatherImageView.setImageDrawable(getResources().getDrawable(R.drawable.dunno));
        }
    }

    public void setTempCelcius(int aTemp) 
    {
        this.myTempTextView.setText("" + aTemp + " °C");
    }

    public void setTempFahrenheit(int aTemp) 
    {
        this.myTempTextView.setText("" + aTemp + " °F");
    }

    public void setTempFahrenheitMinMax(int aMinTemp, int aMaxTemp) 
    {
        this.myTempTextView.setText("" + aMinTemp + "/" + aMaxTemp + " °F");
    }

    public void setTempCelciusMinMax(int aMinTemp, int aMaxTemp) 
    {
        this.myTempTextView.setText("" + aMinTemp + "/" + aMaxTemp + " °C");
    }

    public void setTempString(String aTempString) 
    {
        this.myTempTextView.setText(aTempString);
    }
}

0 个答案:

没有答案