这是第一次在CSDN上发表文章,也是一次小小的尝试。主要原因是安卓课程的作业需要用到天气接口,CSDN这个平台上的很多大神都是采用和风天气控制台提供的接口来制作软件;于是,我在4月28号注册了和风天气的账号,并且新建了一个应用,然后复制粘贴了各路代码,下载了无数个Demo项目…结果就是出不来天气信息,十分无奈。等到4月30号,我查看了和风天气的SDK开发文档,才发现了问题所在!因为和风天气在4月29号更新了,版本号为3.0,而更新前的版本号为2.4。这是导致新版开发文档描述的方法与旧版不匹配的原因!经过一天的尝试,于今日终于查询出天气信息,故记录如下,以便今后查阅!
配置步骤
①
根据和风天气 Android SDK 使用文档,需要先下载.jar文件,地址如下:
https://dev.heweather.com/docs/sdk/android
将下载得到的库(sdk_HeWeather_Public_Android_V3.0.jar),复制到
Project-app-libs目录下,库添加完毕。
②
打开项目Android Manifest,为手机添加网络权限,权限列表如下:
必选一项
允许连接网络 android.permission.INTERNET
可选两项
访问设备状态 android.permission.READ_PHONE_STATE
访问WIFI状态 android.permission.ACCESS_WIFI_STATE
如果不传递城市参数,此权限为必选,否则无法使用对应的方法
访问网络定位 android.permission.ACCESS_COARSE_LOCATION
访问GPS定位 android.permission.ACCESS_FINE_LOCATION
建议全部添加,新手开发避免出错。
③
打开build.gradle(app)文件,添加库依赖代码:
dependencies {
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.google.code.gson:gson:2.6.2'
}
打开proguard-rules.pro文件,在最后添加如下代码:
# 排除okhttp
-dontwarn com.squareup.**
-dontwarn okio.**
-keep public class org.codehaus.* { *; }
-keep public class java.nio.* { *; }
# 排除HeWeather
-dontwarn interfaces.heweather.com.interfacesmodule.**
-keep class interfaces.heweather.com.interfacesmodule.** { *;}
上述配置操作完成后,便可以开始最主要的代码编写了。
代码编写
根据和风天气提供的开发文档,可以复制编写代码如下:
public class MainActivity extends AppCompatActivity {
private static final String TAG="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
HeConfig.init("你的Username", "你的Key");
setContentView(R.layout.activity_main);
HeWeather.getWeatherNow(MainActivity.this, "CN101010100", Lang.CHINESE_SIMPLIFIED ,
Unit.METRIC , new HeWeather.OnResultWeatherNowBeanListener() {
@Override
public void onError(Throwable e) {
Log.i(TAG, "Weather Now onError: ", e);
}
@Override
public void onSuccess(Now dataObject) {
Log.i(TAG, " Weather Now onSuccess: " + new Gson().toJson(dataObject));
//先判断返回的status是否正确,当status正确时获取数据,
//若status不正确,可查看status对应的Code值找到原因
if ( Code.OK.getCode().equalsIgnoreCase(dataObject.getStatus()) ){
//此时返回数据
NowBase now = dataObject.getNow();
} else {
//在此查看返回数据失败的原因
String status = dataObject.getStatus();
Code code = Code.toEnum(status);
Log.i(TAG, "failed code: " + code);
}
}
});
}
}
这时手机需要连接到wifi或者移动网络,然后运行代码,会发现监视器输出如下
这里表示软件已经可以去到和风天气的后台读取数据了,可是查阅控制台数据统计却发现,并没有访问记录,这是为什么呢?原因其实已经写得很明白了,就是获取不到相关的权限“permission denied”,那么权限在哪里呢?
和风天气的SDK文档中有这么一段话,
也就是说,它默认把“我”当做了付费开发者,也就是所编写运行的软件,默认访问到了付费的节点服务域名。明白这一个关系之后,重新编写代码,在
HeConfig.init("你的Username", "你的Key");
代码后面加上
HeConfig.switchToFreeServerNode();
这时重新编译运行软件可以发现,
控制台输出了此时获取到的天气情况。
总结,和风天气新版本的库更新了天气信息的获取方法,其次,在获取天气信息之前,需要了解开发者的身份(是否付费)并初始化开发环境。