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

前段时间用JMessage开发了一款即时通讯软件。

但是有些遗憾的是,sdk并没有提供用户在线状态判断的方法。

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

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

822ae02e9bd7?utm_source=oschina-app

集成网络访问框架

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

822ae02e9bd7?utm_source=oschina-app

先获取加密后的字符串

注意字符串的拼接,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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值