Android使用和风天气Sdk获取实况天气数据(一)
说明(遇到的坑)
在写这篇博客之前遇到了很多问题,出现问题的原因:
1. 没有认真参考说明文档
2. 没有认真查看最新和风天气sdk实况天气json数据格式内容
3. 没有认真考虑过对应包名与对应key值关系(开发者在使用对应包名com.example.tobey_r1下的测试key时如果是使用免费节点则只能测试)
这里也要特殊解释一下:如果你在和风天气控制台中创建了两个应用A和B对应包名com.example.A和com.example.B,如果你用A的测试username与key去在应用b中开发使用就会报:{"status":"bad bind"}
我们查看和风天气错误码(ps最新的参照表):
我们会发现就会发现这个提示(毕竟你使用的是天气数据免费版)像我就升级了一个(emm,比较请求1000次才8毛用的计量计费模式)使用天气数据商业版唯一的好处就是免费版有总次数限制以及添加其他功能(关于免费版和商业版他的节点不一样,代码要改动一丢丢,下面会说)注意免费版使用免费节点,商业版使用商业节点不然后报无访问权限
如图:
4.开发者注册的日期坑(2018年之前的与之后因为版本更新使用了s6版本,使我们学习前辈写的和风请求实况会报未知错误或是无访问权限究其原因还是json数据格式发生变化啦)如下:
老版和风json格式( Sdk v2.0以内,具体的我也不太清楚)
[{"now":{"fl":"31","tmp":"28","cond_code":"101","cond_txt":"多云","hum":"74","pcpn":"0.0","pres":"1013","vis":"16","cloud":"91","wind_deg":"83","wind_dir":"东风","wind_sc":"2","wind_spd":"7"},"basic":{"cid":"CN101190105","location":"六合","parent_city":"南京","admin_area":"江苏","cnty":"中国","lat":"32.34065628","lon":"118.85064697","tz":"+8.00"},"status":"ok","update":{"loc":"2019-09-12 11:21","utc":"2019-09-12 03:21"}}]
新版和风json格式(Sdk v3.0+)
{"now":{"cloud":"91","cond_code":"101","cond_txt":"多云","fl":"32","hum":"80","pcpn":"0.0","pres":"1010","tmp":"29","vis":"9","wind_deg":"89","wind_dir":"东风","wind_sc":"2","wind_spd":"11"},"basic":{"admin_area":"江苏","cid":"CN101190101","cnty":"中国","lat":"32.04154587","location":"南京","lon":"118.76741028","parent_city":"南京","tz":"+8.00"},"status":"ok","update":{"loc":"2019-09-12 11:33","utc":"2019-09-12 03:33"}}
如果你是2018年以后注册的开发者则会因为解析原因等即使按照前辈们写的依然会出现未知错误。(最简单的办法嘛就是使用最新的和风sdk咯)
效果图
实现过程
好啦,基本注意的点都说啦,如果还是有不明白的可以评论问我哦,基本白天都在的。
第一步,注册账号(2018年以后的开发者,如果是以前的想知道如何获取实况天气也可以私我)
打开和风天气网页,点击注册,然后进入控制台:
新建一个应用(当然名字取自几喜欢的):
点击添加key:
这里包名就是我们项目的包名
添加后如下图所示:
我们现在就可以在项目中注册使用啦(要在包名是com.example.wheather即你刚刚设置的包名的那个项目中使用)
第二步 添加引用
去和风天气里下载androidSDK如下图:
下载完以后,将jar包复制到l项目的 libs文件夹内,然后右键选择Add asLibrary
修改项目的build.gradle添加如下:
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
implementation 'com.google.code.gson:gson:2.6.2'
//下面这个是你上面add as library时自动添加的
implementation files('libs/HeWeather_Public_Android_V3.1 .jar')
第三步 修改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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFF"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_tianqi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
/>
<TextView
android:id="@+id/tv_kongqi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
/>
<TextView
android:id="@+id/tv_airqlty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
/>
</LinearLayout>
第四步 修改MainActivity.java
package com.example.weathertest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.google.gson.Gson;
import org.json.JSONException;
import org.json.JSONObject;
import interfaces.heweather.com.interfacesmodule.bean.Lang;
import interfaces.heweather.com.interfacesmodule.bean.Unit;
import interfaces.heweather.com.interfacesmodule.bean.air.now.AirNow;
import interfaces.heweather.com.interfacesmodule.bean.weather.now.Now;
import interfaces.heweather.com.interfacesmodule.view.HeConfig;
import interfaces.heweather.com.interfacesmodule.view.HeWeather;
public class MainActivity extends AppCompatActivity {
String TAG="MainActivity";
TextViewtv_tianqi,tv_kongqi,tv_airqlty;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//username,key要替换成你自己的哦
HeConfig.init("HE1909121339201612","083fbdf0edca4082813382b9551043e9");
HeConfig.switchToFreeServerNode();
tv_tianqi =(TextView) findViewById(R.id.tv_tianqi);
tv_kongqi =(TextView) findViewById(R.id.tv_kongqi);
tv_airqlty =(TextView) findViewById(R.id.tv_airqlty);
}
@Override
protected void onStart() {
super.onStart();
getWether();
}
private void getWether() {
/**
* 实况天气
* 实况天气即为当前时间点的天气状况以及温湿风压等气象指数,具体包含的数据:体感温度、
* 实测温度、天气状况、风力、风速、风向、相对湿度、大气压强、降水量、能见度等。
* @param context 上下文
* @param location 地址详解
* @param lang 多语言,默认为简体中文
* @param unit 单位选择,公制(m)或英制(i),默认为公制单位
* @param listener 网络访问回调接口
*/
HeWeather.getWeatherNow(MainActivity.this, "CN101190101", Lang.CHINESE_SIMPLIFIED , Unit.METRIC , new HeWeather.OnResultWeatherNowBeanListener() {
public static final String TAG="he_feng_now";
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: ", e);
System.out.println("Weather Now Error:"+new Gson());
}
@Override
public void onSuccess(Now dataObject) {
Log.i(TAG, " Weather Now onSuccess: " + new Gson().toJson(dataObject));
String jsonData = new Gson().toJson(dataObject);
String tianqi = null,wendu = null, tianqicode = null;
if (dataObject.getStatus().equals("ok")){
String JsonNow = new Gson().toJson(dataObject.getNow());
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(JsonNow);
tianqi = jsonObject.getString("cond_txt");
wendu = jsonObject.getString("tmp");
} catch (JSONException e) {
e.printStackTrace();
}
}else {
Toast.makeText(MainActivity.this,"有错误",Toast.LENGTH_SHORT).show();
return;
}
String wendu2 = wendu +"℃";
tv_tianqi.setText("当前天气:"+tianqi);
tv_kongqi.setText("当前温度:"+wendu2);
}
});
HeWeather.getAirNow(MainActivity.this, "CN101190101", Lang.CHINESE_SIMPLIFIED, Unit.METRIC, new HeWeather.OnResultAirNowBeansListener() {
public static final String TAG2="he_feng_air";
@Override
public void onError(Throwable throwable) {
Log.i(TAG2,"ERROR IS:",throwable);
}
@Override
public void onSuccess(AirNow airNow) {
Log.i(TAG2,"Air Now onSuccess:"+new Gson().toJson(airNow));
String airStatus = airNow.getStatus();
if (airStatus.equals("ok")){
String jsonData = new Gson().toJson(airNow.getAir_now_city());
String aqi = null,qlty = null;
JSONObject objectAir = null;
try {
objectAir = new JSONObject(jsonData);
aqi = objectAir.getString("aqi");
qlty = objectAir.getString("qlty");
tv_airqlty.setText("天气状况:"+qlty+" "+"空气质量:"+"("+aqi+")");
} catch (JSONException e) {
e.printStackTrace();
}
}else {
Toast.makeText(MainActivity.this,"有错误",Toast.LENGTH_SHORT).show();
return;
}
}
});
}
}