此功能必须在可用的网络下运行的,确保在有可用网络下才能正常运行,获取当前网络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版)
说明:由于笔者水平有限,难免会出现一些错误或漏洞,望读者批评指正。