在第二篇聚合平台WebService技术中对如何成为聚合平台开发者,如何申请全国天气预报数据服务以及如何通过Java语言编写请求数据的常规方法。本篇研究如何通过集成聚合数据SDK来更加方便省事的获取各种数据,由于我们要开发的是气象助手项目,所以我们还是重点研究如何通过集成聚合数据SDK来获取全国天气预报相关数据,对于其它的数据大家可举一反三。
一、聚合数据SDK说明
JuheApisSDK是一个工具,内部集成了聚合数据平台除电商类所有接口。包括生活常用,位置信息服务,金融基金,影视娱乐,全网数据,其他数据留个大类,再此大类之下又分小类,每个小类下又包含数目不等的实现具体功能的接口。
二、聚合数据SDK的集成
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";
}
b)测试SDK接口使用的场景类(注释非常详细,我就不再重复了)
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) {
}
});
}
}
案例源码下载:http://pan.baidu.com/s/1boetaXp