在第二篇聚合平台WebService技术中对如何成为聚合平台开发者,如何申请全国天气预报数据服务以及如何通过Java语言编写请求数据的常规方法。本篇研究如何通过集成聚合数据SDK来更加方便省事的获取各种数据,由于我们要开发的是气象助手项目,所以我们还是重点研究如何通过集成聚合数据SDK来获取全国天气预报相关数据,对于其它的数据大家可举一反三。
JuheApisSDK是一个工具,内部集成了聚合数据平台除电商类所有接口。包括生活常用,位置信息服务,金融基金,影视娱乐,全网数据,其他数据留个大类,再此大类之下又分小类,每个小类下又包含数目不等的实现具体功能的接口。
a) 将juhe_sdk_v_X_X.jar以及armeabi文件夹(内包含libJuheSDK_v_X_X.so)添加到工程中libs文件夹下,Android 工程会自动将libs文件夹下的jar导入 .如下图:
b)添加相关权限
在AndroidManifest.xml中,加入所需权限:
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
c)添加密钥OpenId
在聚合网站的个人中心-账户信息中可以先找到OpenId,如下图:
在AndroidManifest.xml中,在application标签中通过添加<meta-data>配置OpenId,如下图:
<meta-data
android:name="com.thinkland.juheapi.openid"
android:value="你自己的OpenId值" />
d)初始化SDK
SDK中有些数据需要在使用之前初始化才可使用,一般我们会创建一个MyApplication,在MyApplication中 做一些初始化工作。
package com.kedi.juhesdk.app; import com.thinkland.sdk.android.JuheSDKInitializer; import android.app.Application; public class MyApplication extends Application { <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>public void onCreate() { <span style="white-space:pre"> </span>super.onCreate(); <span style="white-space:pre"> </span>// 初始化聚合SDK <span style="white-space:pre"> </span>JuheSDKInitializer.initialize(getApplicationContext()); <span style="white-space:pre"> </span>} }创建了自己的MyApplication,记得要在AndroidManifest.xml中的application标签中引用。如下图:
(4)使用SDK案例核心代码
a)常量池类
package com.kedi.juhesdk.constant; /** * 常量池类:专门用来存放项目中要用来到常量 * * @author 张科勇 * */ public class AppConstant { // 根据城市名获取天气数据的网络地址 public static final String WEATHER_REPORT_BY_CITY_URL = "http://v.juhe.cn/weather/index"; // 获取天气种类及标识列表网络地址 public static final String WEATHER_ICON_AND_ID_URL = "http://v.juhe.cn/weather/uni"; // 获取支持城市列表网络地址 public static final String CITY_LIST_URL = "http://v.juhe.cn/weather/citys"; // 全国天气预报数据服务编号 public static final int WEATHER_SERVICE_DID = 39; // 表示数据获取成功 public static final String RESULT_OK = "200"; }
package com.kedi.juhesdk; import org.json.JSONException; import org.json.JSONObject; import com.kedi.juhesdk.constant.AppConstant; import com.thinkland.sdk.android.DataCallBack; import com.thinkland.sdk.android.JuheData; import com.thinkland.sdk.android.Parameters; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 测试使用SDK获取某城市对应的天气数据 // 1.获取某城市的天气预报数据 getWeatherByCity("北京"); // 2.获取天气图标与id数据 getWeatherIconAndId(); // 3.获取支持城市列表数据 getCityList(); } /** * 获取某城市的天气预报数据 * * @param cityName * 城市名 */ private void getWeatherByCity(String cityName) { Parameters params = new Parameters(); params.add("cityname", cityName); params.add("dtype", "json"); params.add("format", 2); /** * context:上下文, did:数据服务编号(39代表全国天气预报数据服务), uri:接口地址, * methoed请求方法(get或post), params:请求参数, callBack:数据回调接口 */ JuheData.executeWithAPI(this, AppConstant.WEATHER_SERVICE_DID, AppConstant.WEATHER_REPORT_BY_CITY_URL, JuheData.GET, params, new DataCallBack() { /** * 服务器响应数据成功 */ @Override public void onSuccess(int code, String result) { if (!"".equals(result)) { try { JSONObject jsonObj = new JSONObject(result); String resultcode = jsonObj.getString("resultcode"); if (!"".equals(resultcode) && AppConstant.RESULT_OK.equals(resultcode)) { String weatherInfo = jsonObj.getString("result"); Log.i("weatherInfo:", weatherInfo); } } catch (JSONException e) { e.printStackTrace(); } } } /** * 服务端响应数据完成(无论成功与失败都调用这个方法) */ @Override public void onFinish() { } /** * 服务端响应数据失败 */ @Override public void onFailure(int code, String result, Throwable throwable) { } }); } /** * 获取天气图标与id */ private void getWeatherIconAndId() { JuheData.executeWithAPI(this, AppConstant.WEATHER_SERVICE_DID, AppConstant.WEATHER_ICON_AND_ID_URL, JuheData.GET, null, new DataCallBack() { @Override public void onSuccess(int code, String result) { if (!"".equals(result)) { try { JSONObject jsonObj = new JSONObject(result); String resultcode = jsonObj.getString("resultcode"); if (!"".equals(resultcode) && AppConstant.RESULT_OK.equals(resultcode)) { String weatherIconInfo = jsonObj.getString("result"); Log.i("weatherIconInfo:", weatherIconInfo); } } catch (JSONException e) { e.printStackTrace(); } } } @Override public void onFinish() { } @Override public void onFailure(int code, String result, Throwable throwable) { } }); } /** * 获取支持城市列表数据 */ private void getCityList() { JuheData.executeWithAPI(this, AppConstant.WEATHER_SERVICE_DID, AppConstant.CITY_LIST_URL, JuheData.GET, null, new DataCallBack() { @Override public void onSuccess(int code, String result) { if (!"".equals(result)) { try { JSONObject jsonObj = new JSONObject(result); String resultcode = jsonObj.getString("resultcode"); if (!"".equals(resultcode) && AppConstant.RESULT_OK.equals(resultcode)) { String cityListInfo = jsonObj.getString("result"); Log.i("cityListInfo:", cityListInfo); } } catch (JSONException e) { e.printStackTrace(); } } } @Override public void onFinish() { } @Override public void onFailure(int code, String result, Throwable throwable) { } }); } }