前段時(shí)間用JMessage開發(fā)了一款即時(shí)通訊軟件。
但是有些遺憾的是,sdk并沒有提供用戶在線狀態(tài)判斷的方法。
只能送其它地方入手,去看了其它文檔發(fā)現(xiàn)雖然sdk上沒有可以直接調(diào)用的方法,但是提供了網(wǎng)絡(luò)接口。只是需要自己手動(dòng)去請求數(shù)據(jù)。
對于一個(gè)開發(fā)者來說,這并不是什么太大的問題。

集成網(wǎng)絡(luò)訪問框架
這里使用了Retrofit2.0,當(dāng)然選擇其它方式也可以。比如okhttp、xutil等都是一些非常的方便的網(wǎng)絡(luò)請求框架。
直接在app下build.gradle文件中加入Retrofit依賴,同時(shí)引入解析工廠
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
api地址:
所有的接口地址都是基于這個(gè)根URL,為了后面拓展其它接口的請求,這里直接定義了一個(gè)全局的。
public static final String JPUSH_ROOT = "https://api.im.jpush.cn/";
定義接口:
如果想獲取好友的在線狀態(tài),只需要一個(gè)用戶名的參數(shù)
/*獲取好友在線信息*/
@GET("/v1/users/{username}/userstat")
Call<UserStateBean> isFriendState(
@Path("username") String username);
請求數(shù)據(jù)
在請求前需要進(jìn)行HTTP驗(yàn)證,驗(yàn)證方法是添加加密后的請求頭
HTTP 驗(yàn)證
驗(yàn)證采用 HTTP Basic 機(jī)制,即 HTTP Header(頭)里加一個(gè)字段(Key/Value對):
Authorization: Basic base64_auth_string
其中 base64_auth_string 的生成算法為:base64(appKey:masterSecret)
即,對 appKey 加上冒號,加上 masterSecret 拼裝起來的字符串,再做 base64 轉(zhuǎn)換。
appkey和masterSecret都需要從后臺創(chuàng)建的項(xiàng)目中獲取

先獲取加密后的字符串
注意字符串的拼接,appKey和masterSecret中間有一個(gè)“:”英文字符的冒號。
public static String AppKey="b47a37f342eba5f9fbcd1551";
public static String masterSecret = "8a664e4e727113addc200b61";
public static String base64_auth_string = Base64Utils.getBase64(AppKey +":"+masterSecret);
然后添加請求頭
這里使用攔截的方式添加請求頭,如果相關(guān)接口有其它的請求頭,也需要一起加上
注意: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);
}
});
}
請求體
對請求的方法簡單做了封裝,方便統(tǒng)一管理
/*判斷好友在線狀態(tài)*/
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);
}
獲取響應(yīng)結(jié)果
在需要的地方調(diào)用方法,解析返回結(jié)果,展示到ui界面
/*獲取對方在線狀態(tài)*/
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) {
}
});
}
在進(jìn)行網(wǎng)絡(luò)訪問的時(shí)候有可能會出現(xiàn)驗(yàn)證失敗的情況:
例如
{
error: {
message: "basic authentication failed",
code: 899008
}
}
很大可能是在進(jìn)行字符串拼接或者加密的時(shí)候出現(xiàn)了錯(cuò)誤。
錯(cuò)誤解決請參考:https://community.jiguang.cn/t/jpush/5145/35
項(xiàng)目地址:Android-IM
相關(guān)文章推薦: