Android-IM使用Retrofit獲取好友在線狀態(tài)

前段時(shí)間用JMessage開發(fā)了一款即時(shí)通訊軟件。
但是有些遺憾的是,sdk并沒有提供用戶在線狀態(tài)判斷的方法。

只能送其它地方入手,去看了其它文檔發(fā)現(xiàn)雖然sdk上沒有可以直接調(diào)用的方法,但是提供了網(wǎng)絡(luò)接口。只是需要自己手動(dòng)去請求數(shù)據(jù)。

對于一個(gè)開發(fā)者來說,這并不是什么太大的問題。

REST API文檔

集成網(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)文章推薦:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,034評論 25 709
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 14,313評論 0 15
  • “生活欺騙了你,就是你自怨自艾的理由了?” 假如生活欺騙了你。 普希金會告訴你: 別著急,別難過,好日子在后頭。 ...
    光七束閱讀 236評論 0 0
  • 好多年沒見的同學(xué)一起吃飯,席間一個(gè)話題就是談?wù)摵⒆涌紝W(xué)的事。 這個(gè)的兒子考了飛行員,那個(gè)的女兒成了留學(xué)生,而你——...
    暖曦閱讀 1,039評論 57 58
  • 夕陽的最后一抹余輝灑在湖上,微風(fēng)輕蕩,波光粼粼。四周悄如死寂,老鳥唱壞了喉,老馬跑僵了腿,阿奇洛戰(zhàn)斗到最后一刻,半...
    路漫長閱讀 219評論 0 0

友情鏈接更多精彩內(nèi)容