Android-IM使用Retrofit获取好友在线状态

前段时间用JMessage开发了一款即时通讯软件。
但是有些遗憾的是,sdk并没有提供用户在线状态判断的方法。

只能送其它地方入手,去看了其它文档发现虽然sdk上没有可以直接调用的方法,但是提供了网络接口。只是需要自己手动去请求数据。

对于一个开发者来说,这并不是什么太大的问题。

Android-IM使用Retrofit获取好友在线状态_第1张图片

REST API文档

集成网络访问框架

这里使用了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 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都需要从后台创建的项目中获取

Android-IM使用Retrofit获取好友在线状态_第2张图片

先获取加密后的字符串
注意字符串的拼接,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 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 call = aPi.isFriendState(
                userName);
        call.enqueue(callback);

    }

获取响应结果
在需要的地方调用方法,解析返回结果,展示到ui界面

    /*获取对方在线状态*/
    String state;
    public void friendState(){
        NetWorkManager.isFriendState(userName, new Callback() {
            @Override
            public void onResponse(Call call, Response 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 call, Throwable throwable) {

            }
        });

    }

在进行网络访问的时候有可能会出现验证失败的情况:
例如

{
error: {
message: "basic authentication failed",
code: 899008
}
}

很大可能是在进行字符串拼接或者加密的时候出现了错误。
错误解决请参考:https://community.jiguang.cn/t/jpush/5145/35

项目地址:Android-IM

相关文章推荐:

  • Android-IM从零开始开发一个即时通讯项目
  • Android-IM即时通讯关于消息撤回的处理
  • Android-IM给即时通讯添加一个自动聊天机器人
  • Android-IM使用极光即时通讯发送、接收好友请求

你可能感兴趣的:(Android-IM使用Retrofit获取好友在线状态)