最近做的项目涉及到获取当地的天气状态等信息,偶然发现和风天气这个很好用,所以打算分享一下。
官方文档:https://dev.heweather.com/docs/sdk/android
首先进行注册
并在控制台创建应用获取username,key 待后续使用
下载
和风天气SDK的jar包,并集成到Android项目中
jar包:https://a.hecdn.net/download/api_sdk/HeWeather_Public_Android_V3.3.jar
(可以进入官方网站获取最新版的jar包
集成步骤:(下图展示
- 找到AndroidStudio的Project目录下的app路径的libs文件夹中,将jar包粘贴到该路径。
- 右击jar包,点击[Add As Library] 进行集成
- 集成成功后,Build状态栏显示正常
- 点击build.gradle文件中可以看到相关代码
添加依赖
同时在build.gradle文件的dependencies获取okhttp和gson的依赖
okhttp和gson是我们的old friends了,可见和风天气是利用okhttp进行网络访问同时将天气数据结果用gson的形式传输。
1 //引入okhttp和gson 2 implementation 'com.squareup.okhttp3:okhttp:3.9.0' 3 implementation 'com.google.code.gson:gson:2.6.2'
添加权限
集成成功后在AndroidManifest.xml文件添加相关权限
1 <!--必选Internet网络--> 2 <uses-permission android:name="android.permission.INTERNET"/> 3 <!-- 这个权限用于进行网络定位--> 4 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 5 <!-- 这个权限用于访问GPS定位--> 6 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 7 <!-- 获取运营商信息,用于支持提供运营商信息相关的接口--> 8 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 9 <!-- 用于读取手机当前的状态--> 10 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 11 <!--wifi状态--> 12 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 13 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 14 <!--读取设置 唤醒屏幕--> 15 <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> 16 <uses-permission android:name="android.permission.WAKE_LOCK"/>
获取相应权限后,我们即可通过代码获取地方天气数据
在MainActivity.java的oncreate方法中,先进行天气环境初始化(在主线程中
init参数为第一步注册并获取的username和key,注意:应用定义包名必须和项目的包名一致
1 //和风天气init 初始化 2 /* 3 *参数: 4 * s:Username 5 * s1:Key 6 * */ 7 HeConfig.init("HE2005212341181595","f4cbb7844d664d12b8f4149ea875ad57"); 8 //转换为免费模式 9 HeConfig.switchToFreeServerNode();
在主线程进行动态权限申请,
REQUEST_GSP为自定义私有常量
private final int REQUEST_GPS = 1;
1 //动态申请GPS权限 2 ActivityCompat.requestPermissions(this, 3 new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_GPS);
在动态申请的方法回调中进行weather方法调用
1 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 2 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 3 Toast.makeText(MainActivity.this, "Permission GET", Toast.LENGTH_SHORT).show(); 4 if(requestCode==REQUEST_GPS){ 5 getWeather(); 6 } 7 8 } else { 9 Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show(); 10 } 11 12 super.onRequestPermissionsResult(requestCode, permissions, grantResults); 13 14 }
定义getWeather()方法
1 public void getWeather() { 2 HeWeather.getWeatherNow(MainActivity.this, Lang.CHINESE_SIMPLIFIED, Unit.METRIC, new HeWeather.OnResultWeatherNowBeanListener() { 3 public static final String TAG = "he_feng_now"; 4 5 @Override 6 public void onError(Throwable e) { 7 Log.e(TAG, "onError: ", e); 8 System.out.println("Weather Now Error:" + new Gson()); 9 } 10 11 @Override 12 public void onSuccess(Now dataObject) { 13 Log.e(TAG, " Weather Now onSuccess: " + new Gson().toJson(dataObject)); 14 String jsonData = new Gson().toJson(dataObject); 15 String tianqi = null, wendu = null, tianqicode = null; 16 if (dataObject.getStatus().equals("ok")) { 17 String JsonNow = new Gson().toJson(dataObject.getNow()); 18 JSONObject jsonObject = null; 19 try { 20 jsonObject = new JSONObject(JsonNow); 21 tianqi = jsonObject.getString("cond_txt"); 22 Log.e("tinaqi", tianqi); 23 wendu = jsonObject.getString("tmp"); 24 Log.e("wendu", wendu); 25 } catch (JSONException e) { 26 e.printStackTrace(); 27 } 28 } else { 29 Toast.makeText(MainActivity.this, "有错误", Toast.LENGTH_SHORT).show(); 30 return; 31 } 32 33 } 34 }); 35 36 }
结果
最后运行APP,可以在Log中看到相关信息。
通过获取到的gson字符串,我们可以通过json的getString获取相关数据信息。如天气或者温度等;
tianqi = jsonObject.getString("cond_txt");
当然一些其他的信息我看也可以创建实体类,进行gson字符串的反序列化;
最后通过这些数据进行项目的各种可行性功能操作即可。