Android中基于心知天气API获取天气信息
Android中基于心知天气获取天气信息
- JSON
- JSON简介
- JSON对象
- JSON数组
- JSON解析
- Android中获取天气
- 获取天气的流程
- 获取心知天气的API key
- 获取心知天气的API
- 代码部分
- 实现的效果如下
- 进阶-获取任意城市的天气信息
为什么要写这篇博客,主要是为了巩固一下JSON的知识,所以大家会看到很多偏文字的讲解,当然最后的代码我会贴出来,这点不必担心,如果不想看讲解可以直接跳到实现部分,也可以直接下载源码, 免费的.
JSON
JSON简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 说人话就是“JSON是一种是有一定顺序的数组/对象”。
JSON对象
JSON对象特征就是多个属性是被 {} 括起来的,下面这就是一个JSON对象。
{
“area”: “北京海淀”,
“name”: “李大嘴”,
“age”: 25
}
JSON数组
JSON 数组其实就是包含了多个 JSON 对象的一个集合,数组是以数组括号 [ ] 括起来的,可以看到这个JSON数组是由相同的JSON对象组成。咱们可以把它称为典型的JSON数组
[{
“area”: “广东”,
“name”: “山鸡哥”,
“age”: 25
}, {
“area”: “广西”,
“name”: “布布”,
“age”: 26
}]
有典型的JSON数组,肯定也有非典型的JSON数组
[{
“area”: “江苏”,
“name”: “徐州”,
“age”: 25
}, {
“city”: “江苏”,
“weather”: “晴”,
}]
JSON解析
JSON解析的方式有挺多的,官方提供的是JSONObect解析,谷歌的开源库GSON,还有一些第三方的开源库比如:Jackson,FastJSON。我这里选择的是官方提供的JSONObject进行解析。具体的实现在后面的实现部分会细讲。
Android中获取天气
获取天气的流程
1:找到一个免费的天气API(心知天气)
2:访问API(需要API Key),得到JSON数据
3:解析JSON数据得到天气信息
获取心知天气的API key
先登录心知天气官网,当然你需要先进行注册,登录之后如下图所示
登录之后点击右上角的控制台,如下图所示
选择产品管理下的添加产品,选择免费版,当然你如果有钱选择开发版或者企业版也是可以的。然后回到产品界面,可以看到我们获取的公钥,私钥非常重要但是我们用不上,一个公钥就够了,我是闲着没事又添加了一个密钥。
获取心知天气的API
点击API文档,可以查看心知天气的API示例和说明,我这里直接截图下来。第一行就是API的示例,下面的API示例中的参数说明,应该不需要我多解释吧,注意KEY后面填写的就是我们获取的API公钥
那我们先访问下这个API示例,你可以在浏览器的搜索框中输入上图中的示例,看看能得到什么东西呢
这是什么?这不就是JSON数据吗?我们大致可以看出里面包含着城市,天气,语言等等的信息,我们的任务要便是将这个JSON数据解析出来,变成到正常人能看懂的信息方式。
代码部分
我们要使用OKhttp访问该API,所以要添加OKhttp闭包,在build.Gradle的dependencies{}中添加如下代码,添加后记得同步Gradle文件
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
AndroidMainfest.xml
添加一行权限(申请网络权限)
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/send_request"android:text="Send_request"android:layout_width="match_parent"android:layout_height="wrap_content"/><TextViewandroid:hint="原始JSON数据"android:id="@+id/response"android:layout_width="match_parent"android:layout_height="wrap_content"/><EditTextandroid:hint="city"android:id="@+id/City"android:layout_width="match_parent"android:layout_height="wrap_content"/><EditTextandroid:hint="weather"android:id="@+id/Weather"android:layout_width="match_parent"android:layout_height="wrap_content"/><EditTextandroid:hint="temperature"android:id="@+id/Temperature"android:layout_width="match_parent"android:layout_height="wrap_content"/></LinearLayout>
MainActivity.xml
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {private TextView responseText;private EditText weather;private EditText city;private EditText temperature;private String Weather;private String CityName;private String Tempeature;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button sendRequest = (Button) findViewById(R.id.send_request);responseText = (TextView) findViewById(R.id.response);weather = (EditText) findViewById(R.id.Weather);city = (EditText) findViewById(R.id.City);temperature = (EditText) findViewById(R.id.Temperature);sendRequest.setOnClickListener(this);}@Overridepublic void onClick(View v) {if (v.getId() == R.id.send_request) {sendRequestWithOkHttp();}}private void sendRequestWithOkHttp() {new Thread(new Runnable() {@Overridepublic void run() {try {OkHttpClient client = new OkHttpClient();//创建一个OkHttp实例Request request = new Request.Builder().url("https://api.seniverse.com/v3/weather/now.json?key=SrvH71t8JeTOXNLJP&location=beijing&language=zh-Hans&unit=c").build();//创建Request对象发起请求,记得替换成你自己的keyResponse response = client.newCall(request).execute();//创建call对象并调用execute获取返回的数据String responseData = response.body().string();showResPonse(responseData);//显示原始数据和解析后的数据parseJSONWithJSONObject(responseData);//解析SSON数据} catch (IOException e) {e.printStackTrace();}}}).start();}private void parseJSONWithJSONObject(String jsonData) {//用JSONObect解析JSON数据try {JSONObject jsonObject = new JSONObject(jsonData); JSONArray results = jsonObject.getJSONArray("results"); //得到键为results的JSONArrayJSONObject now = results.getJSONObject(0).getJSONObject("now");//得到键值为"now"的JSONObjectJSONObject location = results.getJSONObject(0).getJSONObject("location"); //得到键值为location的JSONObjectWeather = now.getString("text");//得到"now"键值的JSONObject下的"text"属性,即天气信息CityName = location.getString("name"); //获得城市名Tempeature = now.getString("temperature"); //获取温度} catch (JSONException e) {e.printStackTrace();}}private void showResPonse(final String response) {runOnUiThread(new Runnable() {//切换到主线程,ui界面的更改不能出现在子线程,否则app会崩溃@Overridepublic void run() {responseText.setText(response);city.setText(CityName);weather.setText(Weather);temperature.setText(Tempeature);}});}
}
实现的效果如下
我只解析了其中的天气,温度和城市三个信息,其他的硬套应该不难,
进阶-获取任意城市的天气信息
如果我想获得任意一个城市的天气,应该如何实现呢?其实很简单,只要把API的地址中location的值改成可以输入的值即可.重复代码太多我就不想多写了,我会把源码一并上传,可供大家参考.实现效果如下。
Android中基于心知天气API获取天气信息相关推荐
- 利用Arduino Esp8266 心知天气API 获取天气预报信息(修改后可以DIY一个小型的桌面气象台)
前期准备: 注册心知天气,获取API密钥 https://www.seniverse.com 生成API请求地址,北京今天和未来4天的预报请求地址如下: https://api.seniverse. ...
- STM32使用ESP8266模块AT指令连接心知天气API获取天气信息
由于之前使用STM32单片机来开发一些物联网的小项目,接触到了WIFI模块ESP8266,所以写下来记录一下.本文主要介绍的是STM32通过发送AT指令集来控制ESP8266 WIFI模块连接WiFi ...
- 使用小米天气API获取天气信息
1. URL部分 以下url中"%s"代表的是城市Id,比如北京的cityId=101010100: //获取未来五天预报信息,红色部分信息不需要 WEATHER_DATA_URL ...
- 小程序--------调用高德地图天气api获取天气
一.使用高德天气接口: 网址链接为: https://lbs.amap.com/api/webservice/guide/api/weatherinfo (一)注册并获取Key 使用时候需要注册获取K ...
- 百度天气API 获取天气
一.apikey获得地址 http://lbsyun.baidu.com/apiconsole/key 二.URL的获取 http://api.map.baidu.com/telematics/v3/ ...
- android调用在线天气服务,android通过google api获取天气信息示例
android通过google API获取天气信息 复制代码 代码如下: public class WeatherActivity extends Activity { private TextVie ...
- android自动获取天气,android通过google api获取天气信息示例
android通过google API获取天气信息 public class WeatherActivity extends Activity { private TextView txCity; p ...
- Android开发:基于原生API获取位置信息、卫星信号个数及参与定位的卫星个数
目录 概述 权限申请及开启GPS 调用原生API进行定位 获取设备收到的卫星信号个数 获取用于定位的卫星信号个数 成果图 概述 最近在做室内外无缝定位的相关demo,室外定位中,GNSS定位方法具有精 ...
- html调用腾讯地图定位当前位置,vue web项目中调用腾讯地图API获取当前位置的经纬度...
vue web项目中调用腾讯地图API获取当前位置的经纬度 vue web项目中调用腾讯地图API获取当前位置的经纬度 在main.js 中添加一下代码 import axios from 'axio ...
最新文章
- 首次创建maven项目的准备工作
- 差分 c语言,c语言 bmp位图差分
- 微信小程序 canvas 内容(宽高) 兼容不同机型
- 011_TreeMap对键实现了Comparable接口的对象排序
- 2021-01-07 matlab数值分析 插值法 拉格朗日插值法 牛顿插值法
- Shell编程进阶 1.7 case选择
- js校验文本框只能输入数字(包括小数)
- python随机生成字母和数字的混合字符串_用python生成数字、字母和特殊字符混合的字符串...
- 1.Intro to Deep Learning and Computer Vision
- 剑指云原生数据库 2.0,阿里云发布全新一站式敏捷数据仓库解决方案
- springboot banner在线生成_用了自定义Banner后,SpringBoot瞬间变的高大上了...
- 机器学习与计算机视觉(移动端深度学习优化框架)
- 对openflow 1.0协议的扩展
- Spring Boot单元测试入门实战之关于JUnit
- 新技能 get —— 如何校验 md5(windows)
- LeetCode 2. Add Two Numbers (两数相加)
- linux参考文献_小白爱折腾·其二:手机Linux部署DiscuzX论坛
- 工程测量计算机在线用,工程测量中的计算机编程新技术.doc
- 拼音工具类PinyinUtils
- 对事件流的小故事理解
热门文章
- cf全屏下面桌面任务栏_还有玩CF时,下面会有任务栏。也就是说不能全屏!请问怎么回事...
- zookeeper系列(二)实战master选举 1
- 面对工业4.0,我国工业企业的挑战与对策
- 25.JavaScript的Symbol类型、隐藏属性、全局注册表
- windows输入法只有中文导致无法使用一系列快捷键问题
- 利用 Python 分析 MovieLens 1M 数据集
- android pcm 音量_Android中实时获取音量分贝值详解
- Cannot run program jad 的错误
- 2022最新HTML生成国庆头像网页源码+打开即用
- Android 注解处理器使用攻略