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)的更多相关文章
- Android获取位置信息的方法总结
1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综 ...
- Android 使用GPS获取到经纬度后 无法在Android8.0上使用Geocoder类获取位置信息
由于我的应用在获取到经纬度后在Android8.0不能使用如下代码获取位置信息.只好使用百度地图 WEB服务API 通过调接口的方式获取位置信息. Geocoder geocoder = new Ge ...
- Android 集成GoogleMap,实现定位和获取位置信息
1.准备 我使用的是AS2.2.2,首先FQ注册google开发者帐号,准备获取API Key,网上有许多相关资料我就不再赘述,这里讲一个比较小白级的获取方法,可以减少许多输入 1.1. AS创建项目 ...
- iOS利用HealthKit框架从健康app中获取步数信息
微信和QQ的每日步数最近十分火爆,我就想为自己写的项目中添加一个显示每日步数的功能,上网一搜好像并有相关的详细资料,自己动手丰衣足食. 统计步数信息并不需要我们自己去实现,iOS自带的健康app已经为 ...
- Android GPS应用:动态获取位置信息
在上文中,介绍了GPS概念及Android开发GPS应用涉及到的常用类和方法.在本文中,开发一个小应用,实时获取定位信息,包括用户所在的纬度.经度.高度.方向.移动速度等.代码如下: Activity ...
- jq选择器(jq 与 js 互相转换),jq操作css样式 / 文本内容, jq操作类名,jq操作全局属性,jq获取盒子信息,jq获取位置信息
jq选择器(jq 与 js 互相转换) // 获取所有的页面元素jq对象 $('css3选择器语法'); var $box = $(".box:nth-child(1)"); 获取 ...
- html5获取位置信息,h5获取位置信息
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- iOS从健康app中获取步数信息
统计步数信息并不需要我们自己去实现,iOS自带的健康app已经为我们统计好了步数数据 我们只要使用HealthKit框架从健康app中获取这个数据信息就可以了 1.如下图所示 在Xcode中打开Hea ...
- JS 判断浏览器类型,获取位置信息,让手机震动
判断是否是安卓 var isAndroid = /Android/i.test(navigator.userAgent); 判断是否是IOS系统 var isIOS = /iPhone|iPad|iP ...
随机推荐
- Django 的模板语法之过滤器
后端朝前端页面传递数据的方式 # 第一种 return render(request,'index.html',{'n':n}) # 第二种 return render(request,'index. ...
- 【GDOI2007】JZOJ2020年8月10日提高组T1 夏娜的菠萝包
[GDOI2007]JZOJ2020年8月10日提高组T1 夏娜的菠萝包 题目 Description 夏娜很喜欢吃菠萝包,她的经纪人RC每半个月就要为她安排接下来的菠萝包计划.今天是7月份,RC又要 ...
- 使用 IDEA 创建多模块项目
网上找如何创建多模块项目的资料,大多类似,实践中又各有问题,此文为摸索之后总结 最终项目结构如下: 项目引用关系:app → service → dao 新建父项目 multi-parent mult ...
- moviepy音视频剪辑:视频变换处理与内容相关的变换函数headblur、mask_and/or、mirror_x/y、rotate、painting、scroll介绍
一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<moviepy音视频剪辑:视频剪辑基类VideoC ...
- Mysql 逻辑架构图及日志系统
我们经常能看到如下的逻辑架构图,但是往往不能进行很好的记忆,看过就忘记了,也不知道它的实现方式.今天通过简单的画图来简单了解一下mysql到底是如何执行一个select语句,如何update一条语句. ...
- 软件工程团队作业-Alpha阶段项目复审
Alpha阶段项目复审 复审人:黄杰 复审总结表 小组的名字和链接 优点 缺点,bug/140字 最终名次 项目 一个普通的团队 https://www.cnblogs.com/clsgghost/p ...
- 一些vue项目
https://segmentfault.com/a/1190000010330905
- 合并EXCEL文件到一个文件的V宏
我建的宏: Sub 合并文件的VBA() Dim MyPath, MyName, AWbName Dim Wb As Workbook, WbN As String Dim G As Long Dim ...
- WPF中Logical Tree和Visual Tree的区别
The Logical TreeThe logical tree describes the relations between elements of the user interface. The ...
- Tensorflow学习笔记No.11
图像定位 图像定位是指在图像中将我们需要识别的部分使用定位框进行定位标记,本次主要讲述如何使用tensorflow2.0实现简单的图像定位任务. 我所使用的定位方法是训练神经网络使它输出定位框的四个顶 ...