【android】利用Yahoo API完成天气预报
16lz
2022-04-20
一、 代码展示
1. 文件布局: activity_realize_forecast.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" > <EditText android:inputType="number" android:id="@+id/input" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1"/> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_input"/> </LinearLayout> <!-- 图像显示 --> <ImageView android:contentDescription="@string/image_description" android:id="@+id/iconOfWeather" android:layout_width="wrap_content" android:layout_height="wrap_content"> </ImageView> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" > <!-- 当前时间--> <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <!-- 天气状况 --> <TextView android:id="@+id/weather" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <!-- 温度 --><TextView android:id="@+id/temp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout></LinearLayout>
2. 天气预报主函数:RealizeForecast.java
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 {@Overrideprotected 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}}
3. 提取天气信息: YahooWeatherHandler.java
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) { /** 当遇到如下结构时被调用 * <tag>characters</tag> * <img src="http://l.yimg.com/a/i/us/we/52/34.gif"/><br /> * 提取结果为: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("<img src=")) //判断字符串str 是不是以字符串"<img src="开头 { int index2 = str.indexOf("\"/><br />"); String s2 = str.substring(10, index2); //从str中提取字符串,从字符串str的第11个字符开始,第index2个字符结束 Log.d("test_img S2", s2); this.setIconURL(s2); } }} }
二、 验证结果
1. yahoo API 深圳天气: http://weather.yahooapis.com/forecastrss?w=2161853&u=c
2. 当没有输入城市代号,点击提交
3. 当输入“2161853”,点击提交
附:各个城市代号查询:http://weather.yahoo.com/china/guangdong/shenzhen-2161853/
更多相关文章
- 阅读《Android(安卓)从入门到精通》(13)——日期选择器
- Android(安卓)ToastUtil
- android百度定位
- Android(安卓)App第一次启动或者更新或第一次启动
- 今天玩玩Android(安卓)-==-- 了解一下
- Android(安卓)获得当前进程PackageName
- android 获取屏幕的长和宽
- android 学习笔记有用代码片段(1)
- Android(安卓)HelloWorld程序