- 查看文档,初次集成推荐下载使用IMkit
- 依照文档 IM 基础服务开发指南—>IM界面组件IMkit 配置工程;
·若要在聊天界面可分享地址,需要填写高德key,直接在demo里复制了一个。
<!-- 高德地图-->
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="e09af6a2b26c02086e9216bd07c960ae"/>
用户信息提供者
- 注册
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
RongIM.init(this);
}
}
- 这里下载的2.8.7的融云kit包
- 登录成功后,开始连接融云:connect
- connect成功之后,刷新个人信息
LoginActivity extends BaseActivity implements
RongIM.UserInfoProvider{
oncreat{
。。。。
RongIM.setUserInfoProvider(this, true);
}
@Override
public UserInfo getUserInfo(String s) {
return new UserInfo(s, NickName, Uri.parse(AppConstant.RequestPath.BASE_API_URL + Photo));
}
}
/**
* 连接融云成功
* @param userId 当前 token
*/
@Override
public void onSuccess(String userId) {
Log.d("LoginActivity", "--onSuccess---" + userId);
//刷新用户信息头像 RongIM.getInstance().refreshUserInfoCache(new UserInfo(userId, NickName, Uri.parse(AppConstant.RequestPath.BASE_API_URL + Photo)));
}
继承群组会话界面
MyApplication.java
public class MyApplication extends MultiDexApplication {
public static Context context;//公共的上下文变量
public static ScaleAction scaleScreenHelper;
private String TAG = "ChatActivity";
static MyApplication mInstance;
public static boolean RM_CONNECTED;
public static boolean isRmConnected() {
return RM_CONNECTED;
}
public static void setRmConnected(boolean rmConnected) {
RM_CONNECTED = rmConnected;
}
@Override
public void onCreate() {
super.onCreate();
context = this;
mInstance = this;
//融云相关
RongIM.init(this);
RongIM.getInstance().setSendMessageListener(new MySendMessageListener());
RongIM.setOnReceiveMessageListener(new MyReceiveMessageListener());
}
public static MyApplication getInstance() {
return mInstance;
}
private class MyReceiveMessageListener implements RongIMClient.OnReceiveMessageListener {
/**
* 收到消息的处理。
*
* @param message 收到的消息实体。
* @param left 剩余未拉取消息数目。
* @return 收到消息是否处理完成,true 表示自己处理铃声和后台通知,false 走融云默认处理方式。
*/
@Override
public boolean onReceived(Message message, int left) {
//开发者根据自己需求自行处理
Log.i(TAG, "message" + message.getContent());
String msg = String.valueOf(message);
Log.i(TAG, "msg" + msg);
return false;
}
}
private class MySendMessageListener implements RongIM.OnSendMessageListener {
/**
* 消息发送前监听器处理接口(是否发送成功可以从 SentStatus 属性获取)。
*
* @param message 发送的消息实例。
* @return 处理后的消息实例。
*/
@Override
public Message onSend(Message message) {
//开发者根据自己需求自行处理逻辑
return message;
}
/**
* 消息在 UI 展示后执行/自己的消息发出后执行,无论成功或失败。
*
* @param message 消息实例。
* @param sentMessageErrorCode 发送消息失败的状态码,消息发送成功 SentMessageErrorCode 为 null。
* @return true 表示走自已的处理方式,false 走融云默认处理方式。
*/
@Override
public boolean onSent(Message message, RongIM.SentMessageErrorCode sentMessageErrorCode) {
if (message.getSentStatus() == Message.SentStatus.FAILED) {
if (sentMessageErrorCode == RongIM.SentMessageErrorCode.NOT_IN_CHATROOM) {
//不在聊天室
} else if (sentMessageErrorCode == RongIM.SentMessageErrorCode.NOT_IN_DISCUSSION) {
//不在讨论组
} else if (sentMessageErrorCode == RongIM.SentMessageErrorCode.NOT_IN_GROUP) {
//不在群组
} else if (sentMessageErrorCode == RongIM.SentMessageErrorCode.REJECTED_BY_BLACKLIST) {
//你在他的黑名单中
}
}
MessageContent messageContent = message.getContent();
if (messageContent instanceof TextMessage) {//文本消息
TextMessage textMessage = (TextMessage) messageContent;
Log.d(TAG, "onSent-TextMessage:" + textMessage.getContent());
} else if (messageContent instanceof ImageMessage) {//图片消息
ImageMessage imageMessage = (ImageMessage) messageContent;
Log.d(TAG, "onSent-ImageMessage:" + imageMessage.getRemoteUri());
} else if (messageContent instanceof VoiceMessage) {//语音消息
VoiceMessage voiceMessage = (VoiceMessage) messageContent;
Log.d(TAG, "onSent-voiceMessage:" + voiceMessage.getUri().toString());
} else if (messageContent instanceof RichContentMessage) {//图文消息
RichContentMessage richContentMessage = (RichContentMessage) messageContent;
Log.d(TAG, "onSent-RichContentMessage:" + richContentMessage.getContent());
} else {
Log.d(TAG, "onSent-其他消息,自己来判断处理");
}
return false;
}
}
/**
* 获得当前进程的名字
*
* @param 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;
}
baseActivity.java
因为收到被顶下来的消息需要退出登录,所以写在baseactivity里
RongIM.setConnectionStatusListener(new MyConnectionStatusListener());
private class MyConnectionStatusListener implements RongIMClient.ConnectionStatusListener {
@Override
public void onChanged(RongIMClient.ConnectionStatusListener.ConnectionStatus connectionStatus) {
switch (connectionStatus) {
case CONNECTED://连接成功。
MyApplication.setRmConnected(true);
Log.i(TAG, "连接成功");
//Toast.makeText(mContext,"连接成功",Toast.LENGTH_SHORT).show();
break;
case DISCONNECTED://断开连接。
MyApplication.setRmConnected(false);
Log.i(TAG, "连接断开");
// Toast.makeText(mContext,"连接断开",Toast.LENGTH_SHORT).show();
break;
case CONNECTING://连接中。
Log.i(TAG, "连接ing");
// Toast.makeText(mContext,"连接ing",Toast.LENGTH_SHORT).show();
break;
case NETWORK_UNAVAILABLE://网络不可用。
Log.i(TAG, "网络不可用");
// Toast.makeText(mContext,"网络不可用",Toast.LENGTH_SHORT).show();
break;
case KICKED_OFFLINE_BY_OTHER_CLIENT://用户账户在其他设备登录,本机会被踢掉线
Log.i(TAG, "用户账户在其他设备登录,本机会被踢掉线");
SpUtil.cleanStringValue(Constant.SpConstants.USER_INFO, Constant.SpConstants.Token);
SpUtil.cleanStringValue(Constant.SpConstants.USER_INFO, Constant.SpConstants.ClientId);
Intent intent = new Intent(mContext, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("toast", "用户账户在其他设备登录,本机会被踢掉线");
startActivity(intent);
finish();
break;
}
}
}
需要启动会画界面的地方
拿到群组id后启动:
RongIM.getInstance().startConversation(getActivity(), Conversation.ConversationType.GROUP, groupId, "咨询室");
AndroidManifest.xml
<!-- =======================================融云================================== -->
<!--会话界面-->
<activity
android:name=".chatroom.ConversationActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="com.espar.www.esparclientios"
android:pathPrefix="/conversation/"
android:scheme="rong" />
</intent-filter>
</activity>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.espar.www.esparclientios.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/rc_file_path" />
</provider>
<!-- =======================================融云end================================== -->
ConversationActivity
public class ConversationActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_conversation);
Uri uri = getIntent().getData();
//获取 title
title = uri.getQueryParameter("title").toString();
targetId = uri.getQueryParameter("targetId").toString();
}
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.espar.www.esparclientios.chatroom.ConversationActivity">
<fragment
android:id="@+id/conversation"
android:name="io.rong.imkit.fragment.ConversationFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.constraint.ConstraintLayout>