Android集成高德天气API 天气预报

1.新建工程项目WeatherForecast。

2.在AndroidManifest文件中添加网络访问相关权限。

XML 复制代码
<uses-permission android:name="android.permission.INTERNET"/>

3.设计页面布局activity_main.xml,界面效果如图所示。

4.注册高德开放平台,查阅天气查询API文档,通过API文档可以知道要使用该API必须先申请"Web服务 API"密钥(Key),Key将作为HTTP GET请求URL的参数,接收HTTP请求返回的数据为JSON类型数据。文档中也给出了请求URL地址和JSON数据样例。

5.申请"Web服务"API Key。打开高德开放平台的控制台页面,单击左边栏的应用管理→我的应用→创建新应用,如图所示。

在弹出的新建应用窗口中输入应用名称和应用类型,如图所示。

新建应用完成后将出现如图所示界面,此时还需要添加Key才能使用,单击添加Key将弹出如图所示窗口,填写Key名称,勾选Web服务,阅读并同意相关协议,单击提交,即可生成Key。

6.根据JSON样例,生成天气Bean。首先使用计算机上的浏览器测试HTTP GET请求,请求成功将拿到JSON样例。Android Studio中打开菜单File→Settings→Plugins,搜索并安装GsonFormat插件。插件安装完成后,在Java src目录右击New→Java Class,新建WeatherBean.java,在该文件中右击Generate→GsonFormat,在弹出的窗口中将JSON样例粘贴上去,单击OK,即可生成JSON对应的Bean,这里需要将代码中出错的注解删掉。

7.实现MainActivity类的逻辑,MainActivity需要请求并解析数据。首先在build.gradle中添加GSON的依赖,添加完依赖后需要重新sync整个工程。

Groovy 复制代码
implementation 'com.google.code.gson:gson:2.10.1'

MainActivity类中首先初始化界面控件,找到需要更新的界面控件:

java 复制代码
textViewProvince = findViewById(R.id.textViewProvince);
textViewCity = findViewById(R.id.textViewCity);
textViewReporttime = findViewById(R.id.textViewReporttime);
textViewTemperature = findViewById(R.id.textViewTemperature);
imageViewWeather = findViewById(R.id.imageViewWeather);

随后开启一个子线程请求并解析数据,子线程中请求数据的代码如下:

java 复制代码
String path = "https://restapi.amap.com/v3/weather/weatherInfo?city=110101&key=" + URLEncoder.encode(key);
URL url = new URL(path);
//创建 URL对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置请求方式
conn.setRequestMethod("GET");
//设置超时时间
conn.setConnectTimeout(5000);

获取数据的代码如下:

java 复制代码
int responseCode = conn.getResponseCode();
//获取状态码
if (responseCode == 200) {//访问成功
    byte[] buffer = new byte[1024];//创建接收缓冲区
    InputStream is = conn.getInputStream();//获取服务器的返回流
    int len = is.read(buffer);
    if (len!=0){
        String json1 = new String(buffer,0,len);
}

解析并显示数据的代码如下,使用gson.fromJson()方法解析数据,调用runOnUiThread()更新界面控件:

java 复制代码
Gson gson =new Gson ();
WeatherBean weatherBean = gson.fromJson(json1,WeatherBean.class);
Log.e("ss",weatherBean.getStatus()+weatherBean.getLives().toString());
if (weatherBean.getStatus().equals("1")){
    List<WeatherBean.LivesDTO> lives = weatherBean.getLives();
    WeatherBean.LivesDTO livesDTO = lives.get(0);
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            textViewProvince.setText(livesDTO.getProvince());
            textViewCity.setText(livesDTO.getCity());
            textViewTemperature.setText(livesDTO.getTemperature());
            textViewReporttime.setText(livesDTO.getReporttime());
            if (livesDTO.getWeather().equals("多云")){
imageViewWeather.setImageResource(R.drawable.baseline_cloud_queue_24);
            }else if (livesDTO.getWeather().equals("晴")) {
imageViewWeather.setImageResource(R.drawable.baseline_wb_sunny_24);
            }
        }
    });

高德天气预报Android HTTP

相关推荐
网络研究院1 小时前
Android 安卓内存安全漏洞数量大幅下降的原因
android·安全·编程·安卓·内存·漏洞·技术
凉亭下1 小时前
android navigation 用法详细使用
android
小比卡丘4 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
前行的小黑炭5 小时前
一篇搞定Android 实现扫码支付:如何对接海外的第三方支付;项目中的真实经验分享;如何高效对接,高效开发
android
落落落sss6 小时前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
代码敲上天.7 小时前
数据库语句优化
android·数据库·adb
GEEKVIP9 小时前
手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]
android·macos·ios·智能手机·电脑·手机·iphone
model200511 小时前
android + tflite 分类APP开发-2
android·分类·tflite
彭于晏68911 小时前
Android广播
android·java·开发语言
与衫12 小时前
掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系
android·javascript·sql