【Android】使用和风天气API获取天气数据吧!(天气预报系列之一)

news/2024/9/17 7:39:19/ 标签: android

【Android】使用和风天气API获取天气数据吧!(天气预报系列之一)

古话说得好,要有天气预报,首先需要有天气,和预报。

今天给大家介绍一个好用的天气预报API:和风天气。以及webAPI的使用方法~(和风天气打钱)

和风天气网址:和风天气 | 商业气象服务商, 天气预报,灾害预警,台风路径,卫星云图,天气API/SDK/APP, 天气插件, 历史天气, 气象可视化 (qweather.com)

(广告位招租)

首先我们需要注册一个和风天气账号(要不干脆从盘古开天辟地开始讲?)

点击这个,进入api的控制台。

image-20240908210034448

点击这个,进入项目管理。

image-20240908210119450

而后创建项目。

image-20240908214732418

按图设置即可,首先设置项目名称,而后设置免费订阅(这里免费订阅不可以选是因为笔者已经创建过一个免费订阅的项目)

最后设置Key为Web API,那可能有同学要问了,既然是Android的项目,为什么不用Android SDK呢?

(不用Web API怎么练习okHttp?)

配置好了之后我们可以得到:

image-20240908214945169

当当~

直接点击KEY下方的查看就可以找到你的KEY啦,这个KEY主要是用于计算账户请求次数的,和风天气一天一千次还是很容易用完的,大家写项目的时候一定要记得别写死循环,一下子把天气请求次数用光了。

项目当中

完成了上述操作,我们就可以进入Android Studio,写一个天气请求的工具类。

我们边进入编译器,边打开和风天气的开发文档。

image-20240908215918244

网络请求的发出,首先要拼接一个URL字符串。字符串的可选参数如上。

首先定义好KEY和基础的URL:

private static final String KEY = "114514";private static final String BASE_URL = "https://devapi.qweather.com/v7/weather/";

而后开始写方法:

我这里使用OkHttp作为请求类:

public static String getNowWeatherInfo(String locationID) {String resultResponse = "";String locationUrl = BASE_URL + "now" + "?" + "key=" + KEY + "&" +"location=" + locationID+ "&" + "lang=" + "en";OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(locationUrl).build();try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {resultResponse = response.body().string();Log.d(TAG, "getNowWeatherInfo: " + resultResponse);}} catch (IOException e) {Log.d(TAG, "getNowWeatherInfo: yichang");}return resultResponse;}
  1. 初始化变量
    • 初始化一个空字符串resultResponse,用于存储从API获取的天气信息。
  2. 构建请求URL
    • 构建一个请求URL,这个URL由基础URL(BASE_URL),API的端点(now),以及查询参数组成。查询参数包括API密钥(KEY),地点ID(locationID),以及请求的语言(en表示英语)。
  3. 创建HTTP客户端
    • 创建一个OkHttpClient实例,用于发起网络请求。
  4. 构建请求对象
    • 使用OkHttpClient构建一个Request对象,指定要请求的URL。
  5. 发起网络请求
    • 使用try块来捕获可能发生的IOException
    • 通过OkHttpClient发起网络请求,并获取响应。
  6. 处理响应
    • 检查响应是否成功(response.isSuccessful())。
    • 如果响应成功,将响应体的内容转换为字符串,并存储在resultResponse变量中。
    • 记录响应结果到日志中。
  7. 异常处理
    • 如果在请求过程中发生IOException,捕获异常并记录异常信息到日志中。
  8. 返回结果
    • 返回resultResponse变量,它包含了从API获取的天气信息。如果请求失败,返回的将是空字符串。
  9. 结束方法
    • 方法执行完毕,返回获取的天气信息或空字符串。

依葫芦画瓢,可以画出以下几个方法:

public static String getHourlyWeatherInfo(String locationID) {String resultResponse = "";String locationUrl = BASE_URL + "24h" + "?" + "key=" + KEY + "&" +"location=" + locationID;OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(locationUrl).build();try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {resultResponse = response.body().string();Log.d(TAG, "getHourlyWeatherInfo: " + resultResponse);}} catch (IOException e) {Log.d(TAG, "getHourlyWeatherInfo: yichang");}return resultResponse;}public static String getDailyWeatherInfo(String locationID) {String resultResponse = "";String locationUrl = BASE_URL + "7d" + "?" + "key=" + KEY + "&" +"location=" + locationID+ "&" + "lang=" + "en";;OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(locationUrl).build();try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {resultResponse = response.body().string();Log.d(TAG, "getDailyWeatherInfo: " + resultResponse);}} catch (IOException e) {Log.d(TAG, "getDailyWeatherInfo: yichang");}return resultResponse;}

分别对应按小时计数的天气和按天的天气。

有了网络请求,网络请求返回的是个Json字符串呐。

image-20240908220201316

我们还需要写一个JSON字符串的解析类。

说干就干:

此处以解析当前天气Json为例。

public static NowWeatherInfo parseNowWeatherJson(String jsonStr) {NowWeatherInfo info = null;try {JSONObject locationJson = new JSONObject(jsonStr);String nowJson = locationJson.optString("now");Gson gson = new Gson();info = gson.fromJson(String.valueOf(nowJson), NowWeatherInfo.class);Log.d(TAG, "parseJsonData: " + nowJson);} catch (JSONException e) {Log.d(TAG, "parseJsonData: 解析Json数据失败");}return info;}

在这里,我们使用了Gson解析。Gson对应的类放在下面。

public class NowWeatherInfo {private String temp; // 温度private String feelsLike; // 体感温度private String icon; // 天气图标代码private String text; // 天气状况文本private String wind360; // 风向360度private String windDir; // 风向private String windScale; // 风力等级private String windSpeed; // 风速private String humidity; // 湿度private String precip; // 降水量private String pressure; // 气压private String vis; // 能见度private String cloud; // 云量private String dew; // 露点温度public String getTemp() {return temp;}public void setTemp(String temp) {this.temp = temp;}public String getFeelsLike() {return feelsLike;}public void setFeelsLike(String feelsLike) {this.feelsLike = feelsLike;}public String getIcon() {return icon;}public void setIcon(String icon) {this.icon = icon;}public String getText() {return text;}public void setText(String text) {this.text = text;}public String getWind360() {return wind360;}public void setWind360(String wind360) {this.wind360 = wind360;}public String getWindDir() {return windDir;}public void setWindDir(String windDir) {this.windDir = windDir;}public String getWindScale() {return windScale;}public void setWindScale(String windScale) {this.windScale = windScale;}public String getWindSpeed() {return windSpeed;}public void setWindSpeed(String windSpeed) {this.windSpeed = windSpeed;}public String getHumidity() {return humidity;}public void setHumidity(String humidity) {this.humidity = humidity;}public String getPrecip() {return precip;}public void setPrecip(String precip) {this.precip = precip;}public String getPressure() {return pressure;}public void setPressure(String pressure) {this.pressure = pressure;}public String getVis() {return vis;}public void setVis(String vis) {this.vis = vis;}public String getCloud() {return cloud;}public void setCloud(String cloud) {this.cloud = cloud;}public String getDew() {return dew;}public void setDew(String dew) {this.dew = dew;}@Overridepublic String toString() {return "NowWeatherDataBean{" +"temp='" + temp + '\'' +", feelsLike='" + feelsLike + '\'' +", icon='" + icon + '\'' +", text='" + text + '\'' +", wind360='" + wind360 + '\'' +", windDir='" + windDir + '\'' +", windScale='" + windScale + '\'' +", windSpeed='" + windSpeed + '\'' +", humidity='" + humidity + '\'' +", precip='" + precip + '\'' +", pressure='" + pressure + '\'' +", vis='" + vis + '\'' +", cloud='" + cloud + '\'' +", dew='" + dew + '\'' +'}';}
}

结语

天气预报仅仅有数据肯定不够,至于UI等等后事如何,且听第二三四五六回分解。


http://www.ppmy.cn/news/1522740.html

相关文章

React 应用中集成 Ace Editor

安装 React-Ace 首先,你需要安装 react-ace 和 ace-builds(它包含 Ace Editor 的核心文件): pnpm install react-ace ace-builds用法: import React from react; import AceEditor from react-ace;// 引入你需要的 …

从“游戏科学”到玄机科技:《黑神话:悟空》的视角打开动漫宇宙

近日,中国游戏界迎来了一场前所未有的盛事——由游戏科学公司开发的《黑神话:悟空》正式上线,并迅速成为全球玩家热议的焦点。在居高不下的讨论热度中,有人说他的成功在于对《西游记》为背景进行改编,对原著进行了分析…

es安装ik分词器

下载分词器 首先确定es对应的版本(假设版本是7.10.0)根据版本下载指定的分词器 开始安装 在线安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.10.0/elasticsearch-analysis-ik-…

如何在 Java 中实现线程安全的单例模式?

单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。 在多线程环境下,确保单例模式的线程安全性是非常重要的,因为多个线程可能会同时尝试创建实例,导致实例不唯一的问题。 单例模式…

[数据集][目标检测]翻越栏杆行为检测数据集VOC+YOLO格式512张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):512 标注数量(xml文件个数):512 标注数量(txt文件个数):512 标注类别…

设计模式-装饰器代理观察者

3.7 装饰器模式(代码见vs) 装饰器又叫做包装模式,允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法完整性的前提下,提供了额…

ssm微信小程序的英语学习激励系统论文源码调试讲解

2 关键技术介绍 2.1 SSM框架 开发信息管理系统的主流框架是SSM(Spring Spring MVC MyBatis),SSM框架web层使用Spring MVC框架,使传输前后端数据变得简单;对于业务层使用Spring作为轻量级控制反转和面向切面的容器框…

Java JVM 垃圾回收算法详解

Java 虚拟机(JVM)是运行 Java 应用程序的核心,它的垃圾回收(Garbage Collection, GC)机制是 JVM 中非常重要的一个部分。垃圾回收的主要任务是自动管理内存,回收那些不再被使用的对象,从而释放内…

网吧业务安全对抗(有源码)

网吧业务竞争激烈,网吧都会有以下系统软件。 无盘: 无盘是指没有硬盘。好处是统一维护管理和节约成本。本人研究无盘好几年,后面会专门发帖介绍。 计费: 是指收费系统。 营销软件: 包括销售饮品、‌零食和向客户发送电子邮件营销和短信营销等。产品如…

Redis配置

redis配置管理 可以直接打开配置文件进行查看和修改,也可以通过config命令来进行查看和修改。 配置文件位置 Linux中默认在/etc/redis/redis.conf。Windows 中默认在安装目录下,名为 redis.windows.conf。 查看redis配置 使用redis-cli连接redis后&…

AI绘画SD中如何安装/更新/卸载 Stable Diffusion WebUI 插件?SD新手必看的保姆级教程!

大家好,我是画画的小强 最近有一部分朋友对如何在AI绘画StableDiffusion中 安装管理 WebUI 插件十分陌生,不知道如何下手。 今天就系统地为大家介绍一下 WebUI 插件安装、更新、卸载的相关知识,让初学者能快速掌握插件的使用方法&#xff0c…

MySQL 的关键字

MySQL 中的关键字是数据库中具有特殊含义的保留字,它们用于定义数据库结构、操作数据库数据和控制数据库行为。关键字在 MySQL 查询中扮演着至关重要的角色,因为它们是 SQL 语句的核心组成部分。 1. 数据定义语言 (DDL) 关键字 数据定义语言 (DDL) 关键…

FC 协议概述

FC协议,全称为Fibre Channel(光纤通道)协议,是一种高速网络技术,主要用于连接计算机和存储设备。它最初在1988年开发,目的是提高硬盘协议的传输带宽,侧重于数据的快速、高效、可靠传输。到了上世…

滚雪球学MyBatis-Plus(09):乐观锁与性能优化

前言 在上期内容中,我们详细介绍了 MyBatis Plus 的条件构造器。通过使用 QueryWrapper 和 LambdaQueryWrapper,我们学会了如何构建各种复杂的查询条件,并将这些条件应用于服务层和控制层。条件构造器的灵活性和强大功能,使得查询…

基于django的在线音乐网站设计/基于python的音乐播放系统

Django在线音乐网站设计 摘要:计算机网络如果结合使用信息管理系统,能够提高管理员管理的效率,改善服务质量。优秀的在线音乐网站设计能够更有效管理音乐资讯规范,帮助管理者更加有效管理音乐网站,可以帮助提高克服人工…

JavaScript 实用技巧

1. 使用 const 和 let 替代 var 在 ES6 之前,我们通常使用 var 声明变量。但如今,推荐使用 const 和 let,因为它们具有块级作用域,可以避免很多潜在的问题。 const PI 3.14; // 常量,无法重新赋值 let age 25; // …

misc流量分析

一、wireshark语法 1、wireshark过滤语法 (1)过滤IP地址 ip.srcx.x..x.x 过滤源IP地址 ip.dstx.x.x.x 过滤目的IP ip.addrx.x.x.x 过滤某个IP (2)过滤端口号 tcp.port80tcp.srcport80 显示TCP的源端口80tcp.dstport80 显示…

【高阶数据结构】B树、B+树、B*树

B树、B树、B*树 1. 常见的搜索结构2. B树概念3. B树的插入分析4. B树的插入实现4.1 B树的节点设计4.2 B树的部分插入实现14.3 B树的查找4.4 B树的部分插入实现24.5 插入key的过程4.7 B树的插入完整代码4.8 B树的简单验证4.9 B树的删除4.10 B树的性能分析 5. B树6. B*树7. 总结8…

gitk无法打开

1、电脑重装,重新安装git工具后,发现无法打开现有的仓库,报错如下: 搜索网上的信息,显示是目录下没有.git文件夹,但是在xshell查看文件夹是存在的。 然后进行测试git log指令发现也无法进行显示。 然后按…

网站安全问题整改

网站安全、政务云、第三方安全检测机构等评测出来的网站web安全问题整改,如果你也正需要做这方面,请联系我吧