zoukankan      html  css  js  c++  java
  • GraduateDesign-给APP添加获取位置信息和天气预报的功能(json)

    首先,我的app需要通过网络来获取当前所在的位置。这里我找到了一个json来获取本地位置信息。

    http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js    //获得当前网络所在城市

    返回来的信息是:

    var remote_ip_info = {"ret":1,"start":-1,"end":-1,"country":"u4e2du56fd","province":"u6cb3u5357","city":"u6d1bu9633","district":"","isp":"","type":"","desc":""};
    

     返回信息中的汉字编码是gbk,这里我们需要转一下编码就能直接拿到位置信息。

    country 是 国家,province 是 省份,city 是所在的城市。这里我就可以通过网络来获取我当前所在的位置信息。

    在网上查了一下,查询天气预报都是通过查询服务器上的json来获取天气信息。

    http://wthrcdn.etouch.cn/WeatherApi?city=北京        //获得北京近几天的天气情况
    
    http://www.weather.com.cn/data/cityinfo/101010100.html  //101010100北京的气象ID

    这是贴除了两个网址,第一个返回是xml格式,需要通过xml解析。第一个返回的信息较全,但是第二个好像也有较全的信息,但是我通过网上的链接一直是返回失败。

    第一个有一个缺点,就是没有当天的天气状态(晴、多云、雨等),但是对预报来说却有。

    第二个温度信息不怎么准。没有弄明白是怎么回事。

    获取json需要通过http协议,这里贴上我用到到的代码:(传入json地址,直接返回字符串)

    package com.lmissw.mydesignedapp;
    
    import com.lmissw.mydesignedapp.MainActivity;
    import android.util.Log;
    import android.widget.Toast;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.ProtocolException;
    import java.net.URL;
    
    /**
     * Created by ZhouWangsheng on 2018/1/9.
     */
    
    public class httpGetString {
    
        private static String urlString = null;
        private static String httpUrl = null;
    
        private InputStream outStream = null;
        private static String outString = null;
    
        public static String getString( String urlStr )
        {
            if(urlStr==null)
                return null;
            urlString=urlStr;
            outString = null;
            Thread httpThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    HttpURLConnection connection = null;
                    try {
                        URL url = new URL(urlString);
                        connection = (HttpURLConnection) url.openConnection();
                        connection.setRequestMethod("GET");
                        connection.setRequestProperty("Charset", "UTF-8");  // 设置字符集
                        connection.setConnectTimeout(8000);
                        connection.setReadTimeout(8000);
                        int code = connection.getResponseCode();
    
                        if (code == 200) {
                            InputStream outStream = connection.getInputStream();
                            int fileLength = connection.getContentLength();
    
                            BufferedReader reader = new BufferedReader(new InputStreamReader(outStream));
                            StringBuilder jsonText = new StringBuilder();
                            String line = null;
                            try {
                                while ((line = reader.readLine()) != null) {
                                    jsonText.append(line + "/n");
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            } finally {
                                try {
                                    outStream.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                                outString = jsonText.toString();
                            }
                            Log.i("Infor", "请求成功 "+fileLength);
                        } else {
                            Log.i("Infor", "请求失败");
                        }
                    } catch (ProtocolException e) {
                        e.printStackTrace();
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        if (connection != null) {
                            connection.disconnect();
                            Log.i("Infor", "disconnect ok");
                        }
                    }
                }
            });
            httpThread.start();
            while(httpThread.isAlive());
            Log.i("Infor", "httpData:"+outString);
            return outString;
        }
    }
    

      

    下面是解析天气信息的json:

    private void  analysisJsonWeather( String jsonString )
        {
            try {
                JSONTokener  jsonParser = new JSONTokener( jsonString );
                JSONObject json = (JSONObject)jsonParser.nextValue();
    
                JSONObject jsonWeather = json.getJSONObject("weatherinfo");
                String str = jsonWeather.getString("city");
                if(str.equals(localCity)==false)
                {
                    return;
                }
                str = jsonWeather.getString("temp1");
              //  today.temperMin= Integer.parseInt(str.replaceAll("[^-+.\d]", ""));
                str = jsonWeather.getString("temp2");
              //  today.temperMax= Integer.parseInt(str.replaceAll("[^-+.\d]", ""));
              //  Log.i("Infor", "max min:"+today.temperMax+" "+today.temperMin);
    
                today.type = jsonWeather.getString("weather");
               // Log.i("Infor", "type:"+today.type);
    
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    

      

    最后附上解析xml的代码:

       //通过网络获取天气信息的xml文件
            String xmlText = httpGetString.getString(httpWeather+localCity);
    
            if(xmlText==null)
                return false;
            String str=" ";
            ByteArrayInputStream stream = new ByteArrayInputStream(xmlText.getBytes());
            try {
                XmlPullParserFactory pullFactory=XmlPullParserFactory.newInstance();
                XmlPullParser pullParser=pullFactory.newPullParser();
                pullParser.setInput(stream,"UTF-8");
                int entype=pullParser.getEventType();
    
                while (entype!=XmlPullParser.END_DOCUMENT) {
                    String startTag=null;
                    String textData=null;
                    switch(entype) {
                        case XmlPullParser.START_DOCUMENT:   break;
                        case XmlPullParser.START_TAG:
                            String name = pullParser.getName();
                            if (name.equalsIgnoreCase("city")) {
                                String xmlCity = pullParser.nextText();
                                if (xmlCity.equalsIgnoreCase(localCity) == false)    // 如果后面是Text元素,即返回它的值
                                {
                                    Log.i("Infor", "获取城市天气出错,当前获取的城市是:" + xmlCity);
                                    return false;
                                }
                            } else if (name.equalsIgnoreCase("wendu")) {
                                today.temper = Integer.parseInt(pullParser.nextText());
                            } else if (name.equalsIgnoreCase("shidu")) {
                                /* 删除非数字部分 */
                                String num = pullParser.nextText().replaceAll("[^-+.\d]", "");
                                today.humidity = Integer.parseInt(num);
    
    
                            } else if (name.equalsIgnoreCase("fengxiang")) {
                                today.windDir = pullParser.nextText();
                            } else if (name.equalsIgnoreCase("updatetime")){
                                today.updateTime = pullParser.nextText();
                            }else if (name.equalsIgnoreCase("yesterday")) {
    
                                int begin = xmlText.toString().indexOf('!');
                                String fengliString = xmlText.substring(begin+6,begin+16);
                                begin = fengliString.toString().indexOf('[');
                                int end = fengliString.toString().indexOf(']');
                                today.windpower = fengliString.substring(begin+1,end);
                                Log.i("Infor", "风力:" + today.windpower);
                                return true;
                            }
                                break;
                        case XmlPullParser.END_DOCUMENT:    break;
                        case XmlPullParser.END_TAG:         pullParser.getName(); break;
                    }
                    entype=pullParser.next();
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            Log.i("Infor", "获得当前位置:"+str);
    

      

  • 相关阅读:
    如何去掉myeclipse的web项目启动时出现的 CodeLive Panel
    day35_Spring学习回顾_03
    在CentOS/RHEL上设置SSH免密码登录
    超全Linux备份工具集合,满足你的所有需要!
    使用Gnupg对Linux系统中的文件进行加密
    Linux压缩那些事儿
    或许是 Nginx 上配置 HTTP2 最实在的教程了
    Systemd 三部曲 之 PHP7
    Linux kernel模块管理相关详解
    搜狐视频Redis私有云平台CacheCloud
  • 原文地址:https://www.cnblogs.com/ynxf/p/8257694.html
Copyright © 2011-2022 走看看