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

news2024/9/17 7:35:20

【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;
    }

    @Override
    public 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.coloradmin.cn/o/2116393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【H2O2|全栈】关于HTML(3)HTML基础(二)

HTML相关知识 目录 HTML相关知识 前言 准备工作 标签的具体分类(二) 本文中的标签在什么位置使用? 本期前置知识点 超文本 超文本引用和源属性 图片标签 锚链接 iframe 锚点 预告和回顾 后话 前言 本系列博客将分享HTML相关…

JavaWeb后端开发总结(3)

AOP基础 AOP概述 首先我们要知道AOP是什么? 看下图 个人解析: AOP叫做面向切面编程,但是实际上就是面向方法编程 图中下面一部分是一个AOP的案例 AOP快速入门案例代码实现 案例:测出业务中各个业务方法所需的执行时间 如果…

怎么利用NodeJS发送视频短信

随着5G时代的来临,企业的数字化转型步伐日益加快,视频短信作为新兴的数字营销工具,正逐步展现出其大的潜力。视频群发短信以其独特的形式和内容,将图片、文字、视频、声音融为一体,为用户带来全新的直观感受&#xff0…

单片机DMA原理及应用详解(上篇)(附工程源码)

这篇文章详细介绍单片机的DMA原理和应用范例。希望我的分享能给你带来不一样的收获! 目录 一、DMA简介 二、DMA原理 三、DMA中断 1. DMA中断的工作原理 2. DMA中断的优点 3. DMA中断的配置和处理 4. 应用场景 四、结语 一、DMA简介 1、DMA(D…

数据分析训练模型后输出模型评估报告

数据分析训练模型后输出模型评估报告 1、模型评估指标 1.1、概念: A:n个正样本,检测到是真值的数量 B:m个负样本,检测到是真值的数量 C:n个正样本,检测到假值的数量 D:m个负样本,检测到假值的数量 1.2、准确率(Accuracy) 正确预测的样本数量与总样本数量的比值。…

轨迹规划-B样条

B样条究竟是干啥的?白话就是给出一堆点,用样条的方式,给这些点连接起来,并保证丝滑的。 同时B样条分为准均匀和非均匀,以下为准均匀为例。 参考链接1:https://zhuanlan.zhihu.com/p/50626506https://zhua…

IP宿主信息在不同领域的广泛应用

在网络世界中,IP地址作为网络设备的唯一标识,扮演着至关重要的角色。而IP宿主信息,通过IP与POI/AOI信息关联,能够帮助用户了解特定IP地址所属的详细信息。本文将深入探讨IP宿主信息在不同领域的广泛应用。 什么是IP宿主信息&…

汽车功能安全--TC3xx之PBIST、MONBIST

目录 1.PMS 电源监控速览 2.PBIST 3.MONBIST 4.小结 1.PMS 电源监控速览 英飞凌TC3xx芯片的四种硬件机制,分别是: PMS:PBIST: Power Built-in Self Test. MCU:LBIST: Logic Built-in Self Test. PMS:MONBIST: Monitor Built-in Self Test. VMT:MBI…

嵌入式基础1-模拟电路技术-3.放大电路

1. 基本放大电路 1. 放大概念与放大电路性能指标 2. 基本共射放大电路工作原理 3. 放大电路的分析方法 阻容耦合 4.案例 2. 多级放大电路 1. 多级放大电路的耦合方式 2. 多级放大电路动态分析 3. 差分放大电路 3. 集成运算放大电路 4. 放大电路的反馈 1. 反馈的基本概念…

云计算第四阶段----CLOUD 01-03

CLOUD Day01 一、虚拟化平台搭建 虚拟化技术产品介绍 #黄线标注的,都是比较主流且常用的虚拟化平台。 虚拟化与云计算的关系 虚拟化是一种技术,它允许在单个物理服务器上创建和运行多个虚拟机(VMs),每个虚拟机都有其…

二叉树的相关选择题和基本方法(持续更新)

二叉树相关选择题和基本方法 选择题1选择题2选择题3选择题4选择题5选择题6选择题7选择题8选择题9选择题10选择题11选择题12选择题13选择题14选择题15选择题16选择题17选择题18选择题19选择题20选择题21选择题22实现二叉树的基本操作查询二叉树当中节点的个数遍历思想子问题思想…

[数据集][图像分类]熊分类数据集309张5类别黑熊泰迪北极熊等

数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):309 分类类别数:5 类别名称:["black","grizzly","panda","polar","teddy"] 每个类别图…

大数据之Flink(五)

15、Flink SQL 15.1、sql-client准备 启用Hadoop集群(在Hadoop100上) start-all.sh启用yarn-session模式 /export/soft/flink-1.13.0/bin/yarn-session.sh -d启动sql-client bin/sql-client.sh embedded -s yarn-sessionsql文件初始化 可以初始化模式、环境(流/批…

BUUCTF(34)特殊的 BASE64

使用pycharm时,如果想把代码撤销到之前的状态可以用 Ctrlz 如果不小心撤销多了,可以用 CtrlShiftZ 还原, 别傻傻的重新敲了 BUUCTF在线评测 (buuoj.cn) 查看字符串,想到base64的变表 这里用的c的标准程序库中的string&#xff0…

JS_循环结构

目录标题 while结构for循环foreach循环 while结构 几乎和JAVA一致 代码 <script> /* 打印99 乘法表 */ var i 1; while(i < 9){ var j 1; while(j < i){ document.write(j"*"i""i*j" "); j; } document.write("<hr/…

《机器学习》数据预处理 删除、替换、填充 案例解析及实现

目录 一、了解数据清洗 1、什么是数据清洗 2、数据清洗步骤 1&#xff09;缺失值处理 2&#xff09;异常值处理 3&#xff09;重复值处理 4&#xff09;格式修正 5&#xff09;数据一致性检查 6&#xff09;数据类型转换 二、数据清洗用法 1、有如下文件内容 2、完…

前向渲染路径

1、前向渲染路径处理光照的方式 前向渲染路径中会将光源分为以下3种处理方式&#xff1a; 逐像素处理&#xff08;需要高等质量处理的光&#xff09;逐顶点处理&#xff08;需要中等质量处理的光&#xff09;球谐函数&#xff08;SH&#xff09;处理&#xff08;需要低等质量…

线程的四种操作

所属专栏&#xff1a;Java学习 1. 线程的开启 start和run的区别&#xff1a; run&#xff1a;描述了线程要执行的任务&#xff0c;也可以称为线程的入口 start&#xff1a;调用系统函数&#xff0c;真正的在系统内核中创建线程&#xff08;创建PCB&#xff0c;加入到链…

C++17: 用折叠表达式实现一个IsAllTrue函数

前言 让我们实现一个 IsAllTrue 函数&#xff0c;支持变长参数&#xff0c;可传入多个表达式&#xff0c;必须全部计算为true&#xff0c;该函数才返回true。 本文记录了逐步实现与优化该函数的思维链&#xff0c;用到了以下现代C新特性知识&#xff0c;适合对C进阶知识有一定…

2025最新:如何打造公司财务管理系统?Java SpringBoot实现,一步到位管理企业财务!

✍✍计算机毕业编程指导师** ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java…