Android 利用和风天气API显示实时天气

最近开发遇到了这样的需求,需要在APP中显示出实时天气等信息,可以利用和风天气提供的API,免费订阅可以使用一定数量的查询额度,不过也差不多够用了。

进入和风天气官网,注册。

控制台 | 和风天气 (qweather.com)

点击新建项目

选择免费订阅,项目名称随便填吧,适用平台选择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)

 

posted @ 2022-11-19 23:28  拾一贰叁  阅读(1834)  评论(2编辑  收藏  举报