Android 利用和风天气API显示实时天气
最近开发遇到了这样的需求,需要在APP中显示出实时天气等信息,可以利用和风天气提供的API,免费订阅可以使用一定数量的查询额度,不过也差不多够用了。
进入和风天气官网,注册。
点击新建项目
选择免费订阅,项目名称随便填吧,适用平台选择Android SDK,key的名称起一个,比如起了个zzuwindelves
绑定packagename时,复制androidManifest.xml里的包名粘上去
这个com.example.xxxx就是包名了
回到项目管理,可以看到public id与key
然后去下载和风天气的android SDK,详见官方文档
Android SDK配置 | 和风天气开发服务 (qweather.com)
修改AndroidManifest.xml,将联网权限打开
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.windelves">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--省略其他代码-->
修改java文件,这里我是直接在Fragment里写的
OnCreateView里的主要代码
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_monitor, container, false);
//getPosition(view);
HeConfig.init("【public id】", "【key】");//将上边创建项目后的id和key复制进去
HeConfig.switchToDevService();
setTempAndHumidity(view);//刚才上边那个函数
//其他无关代码省略
return view;
}
public void setTempAndHumidity(View view){
//location:查询的地区,可通过该地区ID、经纬度进行查询经纬度格式,这里以郑州为例,郑州的城市编号为"CN101180101"
//location可以填城市编号,也可以填经纬度
QWeather.getWeatherNow(getActivity(), "CN101180101", Lang.ZH_HANS, Unit.METRIC, new QWeather.OnResultWeatherNowListener(){
public static final String TAG="he_feng_now";
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: ", e);
System.out.println("获取天气失败");
System.out.println("Weather Now Error:"+new Gson());
}
@Override
public void onSuccess(WeatherNowBean weatherBean){
//Log.i(TAG, "getWeather onSuccess: " + new Gson().toJson(weatherBean));
System.out.println("获取天气成功: " + new Gson().toJson(weatherBean));
//先判断返回的status是否正确,当status正确时获取数据,若status不正确,可查看status对应的Code值找到原因
if (Code.OK == weatherBean.getCode()) {
WeatherNowBean.NowBaseBean now = weatherBean.getNow();
System.out.println(now);
String tianqi=now.getText();//天气
String wendu=now.getTemp()+"℃";//温度
String fengli=now.getWindScale();//风力
String fengxiang=now.getWindDir();//风向
String shidu=now.getHumidity()+"%";//湿度
getActivity().runOnUiThread(new Runnable() {
public void run() {
tv_tianqi=view.findViewById(R.id.tv_tianqi);
tv_wendu=view.findViewById(R.id.tv_wendu);
tv_shidu=view.findViewById(R.id.tv_shidu);
tv_tianqi.setText(tianqi);//显示当前天气
tv_wendu.setText(wendu);//显示当前温度
tv_shidu.setText(shidu);//显示当前湿度
}
});
/*注意这里对控件显示的操作被放在getActivity()...void run(){}里了
这是因为我是在Fragment里操作的,如果把这些放在外边会抛出错误
在Activity中时可以把这些放在外边,不用带什么runOnUi...
参考了https://blog.csdn.net/i_nclude/article/details/105563688*/
}
else {
//在此查看返回数据失败的原因
Code code = weatherBean.getCode();
System.out.println("失败代码: " + code);
//Log.i(TAG, "failed code: " + code);
}
}
});
}
参照官方文档实时天气 for Android | 和风天气开发服务 (qweather.com)
可以看出能够显示的信息还挺多的,风力风速啥的乱七八糟的都有。
运行效果
关于城市编号,中国天气网城市代码-pudn.com
end(此篇主要还是备忘之用,可能有疏漏的地方)
参考文章
android studio json数据解析汇总(备忘)_kim5659的博客-CSDN博客
andriod 和风天气SDK获取实时天气(保姆级教程)_kim5659的博客-CSDN博客
解决Only the original thread that created a view hierarchy can touch its views_菜鸟码农阿庆的博客-CSDN博客
Android框架Volley使用之Json请求实现_Android_脚本之家 (jb51.net)
天气显示功能已经满足了,但是此时只能显示一个地方的天气(比如我提前把郑州的城市代码输进去了,此时就只显示个郑州的天气)
能不能让用户自己选择位置后显示当地天气呢?
和风的API支持通过城市代码或者经纬度定位显示天气,显然......可以让用户自己上网查所求城市的编码,然后再输入进app,app获取到编码后显示这个城市的天气,不过用户不是开发者,这种离谱操作很可能把用户都吓跑。
因此换一种思路,可以借助一些地图服务的SDK,用户在地图上选一个地点,用户点击地点后app获得该地点的经纬度,然后调用和风API输入经纬度获取该地点的天气状况。
这种操作挺主流的,而且也方便不少。
Android 使用腾讯地图定位地点 - 拾一贰叁 - 博客园 (cnblogs.com)