android 根据IP获取天气情况 详细讲解

来源:互联网 发布:如何对待网络语言暴力 编辑:程序博客网 时间:2024/04/30 14:02

分析:

   此功能必须在可用的网络下运行的,确保在有可用网络下才能正常运行,获取当前网络IP判断所在城市,通过城市查询天气

 

1、首先判断网络是否正常(笔者做的是平板应用的一个模块有手机有些功能不一样)

public void getLocalIPAddress() {WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);if (!wm.isWifiEnabled()) {Toast.makeText(this, "没有可用的网络", Toast.LENGTH_LONG).show();}}


2、其次要自动获取IP地址(webservice借口、相关网址),在此,笔者是根据网址获取,在进行解析

getCityIP()

public void getCityIP() {URL url;URLConnection conn = null;InputStream is = null;InputStreamReader isr = null;BufferedReader br = null;String str = "";org.jsoup.nodes.Document doc;try {url = new URL("http://city.ip138.com/city.asp");conn = url.openConnection();is = conn.getInputStream();isr = new InputStreamReader(is);br = new BufferedReader(isr);String input = "";while ((input = br.readLine()) != null) {str += input;}doc = Jsoup.parse(str);String ip1 = doc.body().text();int start = ip1.indexOf("[");int end = ip1.indexOf("]");setIp(ip1.substring(start + 1, end));} catch (Exception e) {e.printStackTrace();}}


3、再次根据IP地址获取城市(webservice借口、解析网页)

getCityByIp():

public void getCityByIp() {try {URL url = new URL("http://whois.pconline.com.cn/ip.jsp?ip=" + getIp());HttpURLConnection connect = (HttpURLConnection) url.openConnection();InputStream is = connect.getInputStream();ByteArrayOutputStream outStream = new ByteArrayOutputStream();byte[] buff = new byte[256];int rc = 0;while ((rc = is.read(buff, 0, 256)) > 0) {outStream.write(buff, 0, rc);}System.out.println(outStream);byte[] b = outStream.toByteArray();// 关闭outStream.close();is.close();connect.disconnect();String address = new String(b,"GBK");if (address.startsWith("北")||address.startsWith("上")||address.startsWith("重")){     setCity(address.substring(0,address.indexOf("市")));    }    if(address.startsWith("香")){     setCity(address.substring(0,address.indexOf("港")));    }  if(address.startsWith("澳")){     setCity(address.substring(0,address.indexOf("门")));    }    if (address.indexOf("省") != -1) {     setCity(address.substring(address.indexOf("省") + 1, address.indexOf("市")));    }} catch (Exception e) {e.printStackTrace();}}

4、进行天气查询实现webservice接口(http://www.webxml.com.cn/webservices/weatherwebservice.asmx)

private static final String NAMESPACE = "http://WebXml.com.cn/";// WebService地址private static String URL = "http://www.webxml.com.cn/webservices/weatherwebservice.asmx";private static final String METHOD_NAME = "getWeatherbyCityName";private static String SOAP_ACTION = "http://WebXml.com.cn/getWeatherbyCityName";private String weatherToday;private SoapObject detail;private String weatherNow;private String weatherWillBe;private void setIcon(String weather, ImageView imageview) {if (weather.equalsIgnoreCase("nothing.gif"))imageview.setBackgroundResource(R.drawable.a_nothing);if (weather.equalsIgnoreCase("0.gif"))imageview.setBackgroundResource(R.drawable.a_0);if (weather.equalsIgnoreCase("1.gif"))imageview.setBackgroundResource(R.drawable.a_1);if (weather.equalsIgnoreCase("2.gif"))imageview.setBackgroundResource(R.drawable.a_2);if (weather.equalsIgnoreCase("3.gif"))imageview.setBackgroundResource(R.drawable.a_3);if (weather.equalsIgnoreCase("4.gif"))imageview.setBackgroundResource(R.drawable.a_4);if (weather.equalsIgnoreCase("5.gif"))imageview.setBackgroundResource(R.drawable.a_5);if (weather.equalsIgnoreCase("6.gif"))imageview.setBackgroundResource(R.drawable.a_6);if (weather.equalsIgnoreCase("7.gif"))imageview.setBackgroundResource(R.drawable.a_7);if (weather.equalsIgnoreCase("8.gif"))imageview.setBackgroundResource(R.drawable.a_8);if (weather.equalsIgnoreCase("9.gif"))imageview.setBackgroundResource(R.drawable.a_9);if (weather.equalsIgnoreCase("10.gif"))imageview.setBackgroundResource(R.drawable.a_10);if (weather.equalsIgnoreCase("11.gif"))imageview.setBackgroundResource(R.drawable.a_11);if (weather.equalsIgnoreCase("12.gif"))imageview.setBackgroundResource(R.drawable.a_12);if (weather.equalsIgnoreCase("13.gif"))imageview.setBackgroundResource(R.drawable.a_13);if (weather.equalsIgnoreCase("14.gif"))imageview.setBackgroundResource(R.drawable.a_14);if (weather.equalsIgnoreCase("15.gif"))imageview.setBackgroundResource(R.drawable.a_15);if (weather.equalsIgnoreCase("16.gif"))imageview.setBackgroundResource(R.drawable.a_16);if (weather.equalsIgnoreCase("17.gif"))imageview.setBackgroundResource(R.drawable.a_17);if (weather.equalsIgnoreCase("18.gif"))imageview.setBackgroundResource(R.drawable.a_18);if (weather.equalsIgnoreCase("19.gif"))imageview.setBackgroundResource(R.drawable.a_19);if (weather.equalsIgnoreCase("20.gif"))imageview.setBackgroundResource(R.drawable.a_20);if (weather.equalsIgnoreCase("21.gif"))imageview.setBackgroundResource(R.drawable.a_21);if (weather.equalsIgnoreCase("22.gif"))imageview.setBackgroundResource(R.drawable.a_22);if (weather.equalsIgnoreCase("23.gif"))imageview.setBackgroundResource(R.drawable.a_23);if (weather.equalsIgnoreCase("24.gif"))imageview.setBackgroundResource(R.drawable.a_24);if (weather.equalsIgnoreCase("25.gif"))imageview.setBackgroundResource(R.drawable.a_25);if (weather.equalsIgnoreCase("26.gif"))imageview.setBackgroundResource(R.drawable.a_26);if (weather.equalsIgnoreCase("27.gif"))imageview.setBackgroundResource(R.drawable.a_27);if (weather.equalsIgnoreCase("28.gif"))imageview.setBackgroundResource(R.drawable.a_28);if (weather.equalsIgnoreCase("29.gif"))imageview.setBackgroundResource(R.drawable.a_29);if (weather.equalsIgnoreCase("30.gif"))imageview.setBackgroundResource(R.drawable.a_30);if (weather.equalsIgnoreCase("31.gif"))imageview.setBackgroundResource(R.drawable.a_31);}public void getWeather(String cityName) {try {SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);rpc.addProperty("theCityName", cityName);SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);envelope.bodyOut = rpc;envelope.dotNet = true;envelope.setOutputSoapObject(rpc);HttpTransportSE ht = new HttpTransportSE(URL);ht.debug = true;ht.call(SOAP_ACTION, envelope);detail = (SoapObject) envelope.getResponse();parseWeather(detail);} catch (Exception e) {e.printStackTrace();}}private void parseWeather(SoapObject detail)throws UnsupportedEncodingException {textview1 = (TextView) this.findViewById(R.id.TextView01);String date = detail.getProperty(6).toString();// 当天天气weatherToday = "\n天气:" + date.split(" ")[1];weatherToday = weatherToday + "\n气温:"+ detail.getProperty(5).toString();weatherToday = weatherToday + "\n风力:"+ detail.getProperty(7).toString() + "\n";weatherNow = detail.getProperty(8).toString();weatherWillBe = detail.getProperty(9).toString();textview1.setText(getIp() + '\n' + getCity() + "\n今天"+ weatherToday);setIcon(weatherNow, image1);setIcon(weatherWillBe, image2);}


5、最后在AndroidMainifest.xml加入权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> 


推荐图书:Android开发实例大全、新手学HTML 5移动开发——面向iOS和Android、Google Android SDK开发范例大全(第3版) 


说明:由于笔者水平有限,难免会出现一些错误或漏洞,望读者批评指正。

 

 

 

原创粉丝点击