最近做的項目涉及到獲取當地的天氣狀態等信息,偶然發現和風天氣這個很好用,所以打算分享一下。
官方文檔: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字符串的反序列化;
最后通過這些數據進行項目的各種可行性功能操作即可。