码迷,mamicode.com
首页 > 移动开发 > 详细

android 得到本地天气情况

时间:2015-05-23 17:02:03      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:android   城市代码获得   天气情况获得   本地ip获得   本地城市名获得   

今天项目新添加了得到本地当天的温度,湿度,pm2.5的值的需求,研究了下,记下劳动成果,为码农少走弯路做贡献。

思路如下:

1.得到手机的外网ip(http://ip-api.com/json)

2.得到本地信息:省份和城市名(http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=)

3.根据省份城市名拿到城市代码(https://code.csdn.net/snippets/621277/master/blog_20150317_1_5052706/raw)

4.根据城市代码得到天气情况 (http://wthrcdn.etouch.cn/WeatherApi?citykey=)


当然天气情况里面有很多这里只拿温度,湿度和pm2.5

具体代码如下:


 

package com.smart.model;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class WeatherCondition {

	 public  static String getIpUrl = "http://ip-api.com/json";
	 public  String getAddress = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=";
	 public  String cityCode = "https://code.csdn.net/snippets/621277/master/blog_20150317_1_5052706/raw";
	 public  String weatherUrl = "http://wthrcdn.etouch.cn/WeatherApi?citykey=";
//	 http://m.weather.com.cn/mweather/101280601.shtml
	 private  String locaInfo;
	 public  SearchWeatherListner weatherListner;
	 private String city ;
	 
	 public interface SearchWeatherListner{
		 
		 public void weatherInfo(String city,String tem,String shidu,String pm);
		 public void error(Exception e);
		 
	 }
	 
	 

	    public WeatherCondition(SearchWeatherListner weatherListner) {
		super();
		this.weatherListner = weatherListner;
	}


		public void getWebIp(final String urlStr) {
	        new Thread() {
	            public void run() {
	                String strForeignIP = "";
	                try {
	                    URL url = new URL(urlStr);

	                    BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));

	                    String s = "";
	                    StringBuffer sb = new StringBuffer("");
	                    while ((s = br.readLine()) != null) {
	                        sb.append(s + "\r\n");
	                    }
	                    br.close();

	                    String webContent = "";
	                    webContent = sb.toString();
	                    System.out.println("webContent:"+webContent);
	                    if(urlStr.equals(getIpUrl)){//1 得到ip
	                    	getIp(webContent);
	                    }else if(urlStr.equals(cityCode)){//3 得到所有cityCode
	                    	getAddress(locaInfo,new JSONObject(webContent));
	                    }
	                    else if(urlStr.indexOf(weatherUrl)!=-1){//4 得到天气情况
	                    	 webContent = sb.toString();
	                    	 parserXml(webContent);
	                    }
	                    else{//2 得到本地信息
	                    	locaInfo =webContent;
	                    	getWebIp(cityCode);
	                    }
	                } catch (Exception e) {
	                	weatherListner.error(e);
	                    e.printStackTrace();
	                }
	            };
	        }.start();

	    }
		public void parserXml(String str){
			
			String wendu = str.substring(str.indexOf("<wendu>"), str.indexOf("</wendu>")).replace("<wendu>", "");
			String shidu = str.substring(str.indexOf("<shidu>"), str.indexOf("</shidu>")).replace("<shidu>", "");
			String pm25 = str.substring(str.indexOf("<pm25>"), str.indexOf("</pm25>")).replace("<pm25>", "");
			System.out.println("wendu:"+wendu+" shidu:"+shidu+" pm25:"+pm25);
	        weatherListner.weatherInfo(city,wendu, shidu, pm25);
		}
		
	    
	    
	    public void getAddress(String str,JSONObject cityJson){
	    	try {
				JSONObject json = new JSONObject(str);
				String country = json.getString("country");
				String province = json.getString("province");
				city = json.getString("city");
				JSONArray ja_province = cityJson.getJSONArray("城市代码");
				for(int i=0;i<ja_province.length();i++){
					JSONObject jo_province =  ja_province.getJSONObject(i);
					if(jo_province.getString("省").equals(province)){
						JSONArray ja_city = jo_province.getJSONArray("市");
						for(int j=0;j<ja_city.length();j++){
							JSONObject jo_city = ja_city.getJSONObject(j);
							if(jo_city.getString("市名").equals(city)){
								String code = jo_city.getString("编码");
								getWebIp(weatherUrl+code);
								System.out.println("code:"+code);
								break;
							}
							
						}
						
						break;
					}
					
				}
				
				
			} catch (JSONException e) {
				weatherListner.error(e);
				e.printStackTrace();
			}
	    }
	    
	    public void getIp(String str){
	    	try {
				JSONObject json = new JSONObject(str);
				String ip = json.getString("query");
				getWebIp(getAddress+ip);
			} catch (JSONException e) {
				weatherListner.error(e);
				e.printStackTrace();
			}
	    	
	    	
	    }
	    
	    
	    
}

代码调用该类 new WeatherCondition(this).getWebIp(WeatherCondition.getIpUrl);

并监听WeatherCondition.SearchWeatherListner改接口

android 得到本地天气情况

标签:android   城市代码获得   天气情况获得   本地ip获得   本地城市名获得   

原文地址:http://blog.csdn.net/yeyuehei/article/details/45934701

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!