前段時間用JMessage開發了一款即時通訊軟件。
但是有些遺憾的是,sdk并沒有提供用戶在線狀態判斷的方法。
只能送其它地方入手,去看了其它文檔發現雖然sdk上沒有可以直接調用的方法,但是提供了網絡接口。只是需要自己手動去請求數據。
對于一個開發者來說,這并不是什么太大的問題。
集成網絡訪問框架
這里使用了Retrofit2.0,當然選擇其它方式也可以。比如okhttp、xutil等都是一些非常的方便的網絡請求框架。
直接在app下build.gradle文件中加入Retrofit依賴,同時引入解析工廠
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
api地址:
所有的接口地址都是基于這個根URL,為了后面拓展其它接口的請求,這里直接定義了一個全局的。
public static final String JPUSH_ROOT = "https://api.im.jpush.cn/";
定義接口:
如果想獲取好友的在線狀態,只需要一個用戶名的參數
/*獲取好友在線信息*/
@GET("/v1/users/{username}/userstat")
Call<UserStateBean> isFriendState(
@Path("username") String username);
請求數據
在請求前需要進行HTTP驗證,驗證方法是添加加密后的請求頭
HTTP 驗證
驗證采用 HTTP Basic 機制,即 HTTP Header(頭)里加一個字段(Key/Value對):
Authorization: Basic base64_auth_string
其中 base64_auth_string 的生成算法為:base64(appKey:masterSecret)
即,對 appKey 加上冒號,加上 masterSecret 拼裝起來的字符串,再做 base64 轉換。
appkey和masterSecret都需要從后臺創建的項目中獲取
先獲取加密后的字符串
注意字符串的拼接,appKey和masterSecret中間有一個“:”英文字符的冒號。
public static String AppKey="b47a37f342eba5f9fbcd1551";
public static String masterSecret = "8a664e4e727113addc200b61";
public static String base64_auth_string = Base64Utils.getBase64(AppKey +":"+masterSecret);
然后添加請求頭
這里使用攔截的方式添加請求頭,如果相關接口有其它的請求頭,也需要一起加上
注意:Basic后面的空格要加上
public static void headers() {
httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(new Interceptor() {
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.addHeader("Content-Type", "application/json; charset=utf-8")
.addHeader("Authorization", "Basic " + base64_auth_string)
.build();
Log.d("onrequest", "request:" + request.toString());
Log.d("onrequestHeader", "request headers:" + request.headers().toString());
return chain.proceed(request);
}
});
}
請求體
對請求的方法簡單做了封裝,方便統一管理
/*判斷好友在線狀態*/
public static void isFriendState(String userName, Callback<UserStateBean> callback){
//請求頭
headers();
OkHttpClient client=httpClient.build();
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(Url.JPUSH_ROOT)
.client(client)
.build();
Api aPi = retrofit.create(Api.class);
Call<UserStateBean> call = aPi.isFriendState(
userName);
call.enqueue(callback);
}
獲取響應結果
在需要的地方調用方法,解析返回結果,展示到ui界面
/*獲取對方在線狀態*/
String state;
public void friendState(){
NetWorkManager.isFriendState(userName, new Callback<UserStateBean>() {
@Override
public void onResponse(Call<UserStateBean> call, Response<UserStateBean> response) {
if (response.code()==200) {
if (response.body().online){
state = "[在線]";
}else {
state = "[離線]";
}
mTitleBarTitle.setText(userName + state);
}else {
mTitleBarTitle.setText(userName);
}
}
@Override
public void onFailure(Call<UserStateBean> call, Throwable throwable) {
}
});
}
在進行網絡訪問的時候有可能會出現驗證失敗的情況:
例如
{
error: {
message: "basic authentication failed",
code: 899008
}
}
很大可能是在進行字符串拼接或者加密的時候出現了錯誤。
錯誤解決請參考:https://community.jiguang.cn/t/jpush/5145/35
項目地址:Android-IM
相關文章推薦: