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获取天气信息相关推荐

  1. 利用Arduino Esp8266 心知天气API 获取天气预报信息(修改后可以DIY一个小型的桌面气象台)

    前期准备: 注册心知天气,获取API密钥  https://www.seniverse.com 生成API请求地址,北京今天和未来4天的预报请求地址如下: https://api.seniverse. ...

  2. STM32使用ESP8266模块AT指令连接心知天气API获取天气信息

    由于之前使用STM32单片机来开发一些物联网的小项目,接触到了WIFI模块ESP8266,所以写下来记录一下.本文主要介绍的是STM32通过发送AT指令集来控制ESP8266 WIFI模块连接WiFi ...

  3. 使用小米天气API获取天气信息

    1. URL部分 以下url中"%s"代表的是城市Id,比如北京的cityId=101010100: //获取未来五天预报信息,红色部分信息不需要 WEATHER_DATA_URL ...

  4. 小程序--------调用高德地图天气api获取天气

    一.使用高德天气接口: 网址链接为: https://lbs.amap.com/api/webservice/guide/api/weatherinfo (一)注册并获取Key 使用时候需要注册获取K ...

  5. 百度天气API 获取天气

    一.apikey获得地址 http://lbsyun.baidu.com/apiconsole/key 二.URL的获取 http://api.map.baidu.com/telematics/v3/ ...

  6. android调用在线天气服务,android通过google api获取天气信息示例

    android通过google API获取天气信息 复制代码 代码如下: public class WeatherActivity extends Activity { private TextVie ...

  7. android自动获取天气,android通过google api获取天气信息示例

    android通过google API获取天气信息 public class WeatherActivity extends Activity { private TextView txCity; p ...

  8. Android开发:基于原生API获取位置信息、卫星信号个数及参与定位的卫星个数

    目录 概述 权限申请及开启GPS 调用原生API进行定位 获取设备收到的卫星信号个数 获取用于定位的卫星信号个数 成果图 概述 最近在做室内外无缝定位的相关demo,室外定位中,GNSS定位方法具有精 ...

  9. html调用腾讯地图定位当前位置,vue web项目中调用腾讯地图API获取当前位置的经纬度...

    vue web项目中调用腾讯地图API获取当前位置的经纬度 vue web项目中调用腾讯地图API获取当前位置的经纬度 在main.js 中添加一下代码 import axios from 'axio ...

最新文章

  1. 首次创建maven项目的准备工作
  2. 差分 c语言,c语言 bmp位图差分
  3. 微信小程序 canvas 内容(宽高) 兼容不同机型
  4. 011_TreeMap对键实现了Comparable接口的对象排序
  5. 2021-01-07 matlab数值分析  插值法 拉格朗日插值法 牛顿插值法
  6. Shell编程进阶 1.7 case选择
  7. js校验文本框只能输入数字(包括小数)
  8. python随机生成字母和数字的混合字符串_用python生成数字、字母和特殊字符混合的字符串...
  9. 1.Intro to Deep Learning and Computer Vision
  10. 剑指云原生数据库 2.0,阿里云发布全新一站式敏捷数据仓库解决方案
  11. springboot banner在线生成_用了自定义Banner后,SpringBoot瞬间变的高大上了...
  12. 机器学习与计算机视觉(移动端深度学习优化框架)
  13. 对openflow 1.0协议的扩展
  14. Spring Boot单元测试入门实战之关于JUnit
  15. 新技能 get —— 如何校验 md5(windows)
  16. LeetCode 2. Add Two Numbers (两数相加)
  17. linux参考文献_小白爱折腾·其二:手机Linux部署DiscuzX论坛
  18. 工程测量计算机在线用,工程测量中的计算机编程新技术.doc
  19. 拼音工具类PinyinUtils
  20. 对事件流的小故事理解

热门文章

  1. cf全屏下面桌面任务栏_还有玩CF时,下面会有任务栏。也就是说不能全屏!请问怎么回事...
  2. zookeeper系列(二)实战master选举 1
  3. 面对工业4.0,我国工业企业的挑战与对策
  4. 25.JavaScript的Symbol类型、隐藏属性、全局注册表
  5. windows输入法只有中文导致无法使用一系列快捷键问题
  6. 利用 Python 分析 MovieLens 1M 数据集
  7. android pcm 音量_Android中实时获取音量分贝值详解
  8. Cannot run program jad 的错误
  9. 2022最新HTML生成国庆头像网页源码+打开即用
  10. Android 注解处理器使用攻略