package com.realize.andorid.realizeforecast;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class RealizeForecast extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_realize_forecast);
Button submit = (Button) findViewById(R.id.btn);
submit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
try {
/* 获取用户输入的城市代号
* 从网址上可以获取对应城市代号:http://weather.yahoo.com/china/guangdong/shenzhen-2161853/
*/
String city = ((EditText) findViewById(R.id.input))
.getText().toString();
/* 如果用户没有输入,则弹出提示 */
if (city.equals(""))
{
Log.d("onClick", "city is null");
Toast.makeText(RealizeForecast.this,
"请输入具体的城市代号!",
Toast.LENGTH_LONG).show();
return;
}
/*组成URL字符串*/
//http://weather.yahooapis.com/forecastrss?w=2162312&u=c
String queryString = "http://weather.yahooapis.com/forecastrss?w="
+ city + "&u=c";
/*将可能的空格替换为"%20"*/
URL aURL = new URL(queryString.replace(" ", "%20"));
//URL aURL = new URL("http://weather.yahooapis.com/forecastrss?w=2161853&u=c");
/* 从SAXParserFactory获取SAXParser*/
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
/* 从SAXParser得到XMLReader*/
XMLReader xr = sp.getXMLReader();
/*
* 创建YahooWeatherHandler,以便解析XML内容
*/
YahooWeatherHandler ywh = new YahooWeatherHandler();
xr.setContentHandler(ywh);
/* 解析XML文件内容 */
xr.parse(new InputSource(aURL.openStream()));
/* 当前时间 */
TextView tv1 = (TextView)findViewById(R.id.time);
tv1.setText("当前时间:" + ywh.getCurrentTime());
/* 天气状况 */
TextView tv2 = (TextView)findViewById(R.id.weather);
tv2.setText("天气状况:" + ywh.getCurrentCondition());
/* 温度*/
TextView tv3 = (TextView)findViewById(R.id.temp);
tv3.setText("目前温度:" + ywh.getCurrentTemp());
/* 获取图像地址,并显示 */
URL iconURL = new URL(ywh.getIconURL());
//URL iconURL = new URL("http://l.yimg.com/a/i/us/we/52/34.gif");
URLConnection conn = iconURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ImageView iv = (ImageView)findViewById(R.id.iconOfWeather);
Bitmap bm = null;
bm = BitmapFactory.decodeStream(bis);
iv.setImageBitmap(bm);
bis.close();
is.close();
/* 清空输入框的内容 */
EditText et = (EditText)findViewById(R.id.input);
et.setText("");
} catch (Exception e) {
Log.e("error",e.toString());
}
}//end of onClick
});//end of SetClick
}
}
package com.realize.andorid.realizeforecast;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
/**
* SAXHandler:用户从Yahoo Weather API返回的XML中提取当前天气信息
*/
public class YahooWeatherHandler extends DefaultHandler {
private String current_time; //当前时间
private String current_condition;//天气状况
private String iconURL; //天气图像
private String current_temp; //天气温度
private boolean in_tag = false; //标识是否解析到“description”
public String getCurrentTime(){
return this.current_time;
}
public String getCurrentCondition(){
return this.current_condition;
}
public String getIconURL(){
return this.iconURL;
}
public String getCurrentTemp(){
return this.current_temp;
}
public void setCurrentTime(String current_time){
this.current_time = current_time;
}
public void setCurrentCondition(String condition) {
this.current_condition = condition;
}
public void setIconURL(String iconURL) {
this.iconURL = iconURL;
}
public void setCurrentTemp(String current_temp){
this.current_temp = current_temp;
}
@Override
public void startDocument() throws SAXException {
}
@Override
public void endDocument() throws SAXException {
}
@Override
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException {
Log.d("weather", localName);
if (localName.equals("condition"))
{
String textAttribute = atts.getValue("text");
this.setCurrentCondition(textAttribute);
String tempAttribute = atts.getValue("temp");
this.setCurrentTemp(tempAttribute);
String dateAttribute = atts.getValue("date");
this.setCurrentTime(dateAttribute);
}
else if(localName.equals("description"))
{
in_tag = true;
}
}
@Override
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {
if(localName.equals("description"))
{
in_tag = false;
}
}
@Override
public void characters(char ch[], int start, int length)
{
/** 当遇到如下结构时被调用
* characters
*
* 提取结果为:http://l.yimg.com/a/i/us/we/52/34.gif
*/
if(this.in_tag)
{
String str = new String(ch, start, length);
Log.d("characters", str);
if (str.startsWith("
");
String s2 = str.substring(10, index2); //从str中提取字符串,从字符串str的第11个字符开始,第index2个字符结束
Log.d("test_img S2", s2);
this.setIconURL(s2);
}
}
}
}
附:各个城市代号查询:http://weather.yahoo.com/china/guangdong/shenzhen-2161853/