转载请注明出处 http://blog.csdn.net/qq_31715429/article/details/51208203
本文出自:猴菇先生的博客
1.集成:按照融云官网文档集成即可;
2.在BaseApplication中初始化:
/**
* 初始化融云即时通讯
*/
private void initRongIm() {
/**
* OnCreate 会被多个进程重入,这段保护代码,确保只有您需要使用 RongIMClient 的进程和 Push 进程执行了 init。
* io.rong.push 为融云 push 进程名称,不可修改。
*/
if(getApplicationInfo().packageName.equals(
SysInfoUtils.getCurProcessName(getApplicationContext()))
||"io.rong.push".equals(
SysInfoUtils.getCurProcessName(getApplicationContext()))) {
RongIMClient.init(this);
}
}
}
/**
* 获得当前进程的名字
*
* @param context context
* @return 进程号
*/
public static String getCurProcessName(Context context) {
int pid = android.os.Process.myPid();
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) {
if (appProcess.pid == pid) {
return appProcess.processName;
}
}
return null;
}
3.在MainActivity.java中连接、接收消息、发送消息:
/**
* 融云相关
*/
private void setRongIm() {
getToken();
receiveMsg();
RongIMClient.setConnectionStatusListener(new RongIMClient.ConnectionStatusListener() {
@Override
public void onChanged(ConnectionStatus connectionStatus) {
LogMessage.e("monkey", "融云连接状态监听--> " + connectionStatus.toString());
}
});
RongIMClient.setOnReceivePushMessageListener(new RongIMClient.OnReceivePushMessageListener() {
@Override
public boolean onReceivePushMessage(PushNotificationMessage pushNotificationMessage) {
LogMessage.e("monkey", "融云离线通知监听--> " + pushNotificationMessage.getPushContent());
//返回true可以不显示融云离线消息通知
return true;
}
});
}
/**
* 请求Server API,获取token
*/
private void getToken() {
deviceId = SysInfoUtils.readTelephoneSerialNum(MainActivity.this);//userId用设备号替代
String name = "monkey";//用户名
String portraitUri = "http://rongcloud-web.qiniudn.com/docs_demo_rongcloud_logo.png";//头像
HomeApi.getRongToken(deviceId, name, portraitUri, new ApiCallBack<RongImBean>() {
//请求token的接口地址是"https://api.cn.ronghub.com/user/getToken.json"
//除了需要post传userId、name、和portraitUri外
//还需要addHeader参数App-Key(申请的app key)、
// Nonce(随机数 double r = new Random().nextDouble();)、
// Timestamp(时间戳 long t = System.currentTimeMillis();)、
// Signature(申请的app secret、Nonce和Timestamp的sha1加密值)
@Override
public void onSuccess(RongImBean result) {
super.onSuccess(result);
if (result != null && result.getToken() != null) {
token = result.getToken();
Log.e("monkey", "融云token--> " + token);
connect(token);
}
}
});
}
/**
* 接收消息
*/
private void receiveMsg() {
RongIMClient.setOnReceiveMessageListener(new RongIMClient.OnReceiveMessageListener() {
/**
* 收到消息的处理。
* @param message 收到的消息实体。
* @param i 剩余未拉取消息数目。
* @return 是否接收
*/
@Override
public boolean onReceived(final Message message, int i) {
if (message != null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
sendTime = new SimpleDateFormat("yyyy年MM月dd日HH时mm分").format(new Date(message.getSentTime()));
rongMsg = (TextMessage) message.getContent();
Log.e("monkey", "融云接收消息-->"
+ "userId:" + message.getSenderUserId()
+ " 内容:" + rongMsg.getContent()
+ " 发送时间:" + sendTime);
//收到消息后写自己的操作逻辑
}
});
}
return true;
}
});
}
/**
* 建立与融云服务器的连接
*
* @param token token
*/
private void connect(String token) {
if (getApplicationInfo().packageName.equals(SysInfoUtils.getCurProcessName(getApplicationContext()))) {
RongIMClient.connect(token, new RongIMClient.ConnectCallback() {
@Override
public void onTokenIncorrect() {
Log.e("monkey", "融云 Token 错误,在线上环境下主要是因为 Token 已经过期,您需要向 App Server 重新请求一个新的 Token");
}
@Override
public void onSuccess(String userId) {
Log.e("monkey", "连接融云成功--> " + userId);
}
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
Log.e("monkey", "连接融云失败,错误码--> " + errorCode);
}
});
}
}
/**
* 发送消息
*/
private void sendMsg(String userId) {
/**
* 发送普通消息
* @param conversationType 会话类型
* @param targetId 会话ID
* @param content 消息的内容,一般是MessageContent的子类对象
* @param pushContent 接收方离线时需要显示的push消息内容
* @param pushData 接收方离线时需要在push消息中携带的非显示内容
* @param SendMessageCallback 发送消息的回调
* @param ResultCallback 消息存库的回调,可用于获取消息实体
*/
RongIMClient.getInstance().sendMessage(Conversation.ConversationType.PRIVATE, userId, TextMessage.obtain("你好"), null, null, new RongIMClient.SendMessageCallback() {
@Override
public void onSuccess(Integer integer) {
String str = "消息发送成功";
Log.e("monkey", str);
}
@Override
public void onError(Integer integer, RongIMClient.ErrorCode errorCode) {
String str = "消息发送失败";
Log.e("monkey", str);
}
}, null);
}