GraduateDesign-给APP添加获取位置信息和天气预报的功能(json)

Posted 叶念西风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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":"\u4e2d\u56fd","province":"\u6cb3\u5357","city":"\u6d1b\u9633","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);

  



以上是关于GraduateDesign-给APP添加获取位置信息和天气预报的功能(json)的主要内容,如果未能解决你的问题,请参考以下文章

js怎么获取数组中元素的位置?

如何使用swift获取appdelegate中的当前位置

Android 获取位置信息

Android 获取位置信息

Android获取桌面启动图标的位置

Android获取桌面启动图标的位置