一、服务端好友关系列表在自己的服务器上已部署完成,并且实现了与融云服务器的交互
二、通过App发送消息到自己的服务端,得到App与自己服务器交互的token以及App与融云服务器交互的token
1、App自己服务器token(令牌),用于App与自己服务器交互
2、App融云服务器token(令牌),用户App与融云服务器交互
三、在融云官方网站上下载IMKit、IMLib,并进行添加配置
四、一般在Application onCreate()函数中进行融云初始化设置
public class Application extends Application implements RongIM.UserInfoProvider{ @Override public void onCreate() { super.onCreate(); if (getApplicationInfo().packageName.equals(getCurProcessName(getApplicationContext())) || "io.rong.push".equals(getCurProcessName(getApplicationContext()))) { RongIM.init(this); RongIM.setOnReceiveMessageListener(new RongMessageHandling.MyReceiveMessageListener()); RongIM.setConnectionStatusListener(new RongMessageHandling.MyConnectionStatusListener()); RongIM.getInstance().registerConversationTemplate(new RongMessageHandling.MyPrivateConversationProvider()); //RongIM.getInstance().registerMessageTemplate(new MyTextMessageItemProvider()); } } /** * 获取融云所需用户信息 * */ @Override public UserInfo getUserInfo(String userId) { if (FriendInfoList.getInstance() == null) { return null; } return FriendInfoList.getInstance().getUserInfoByUserId(userId); } }
定义相应的监听类
/** * 融云消息监听 */ static public class MyReceiveMessageListener implements RongIMClient.OnReceiveMessageListener { /** * 收到消息的处理。 * * @param message 收到的消息实体。 * @param left 剩余未拉取消息数目。 * @return 收到消息是否处理完成,true 表示自己处理铃声和后台通知,false 走融云默认处理方式。 */ @Override public boolean onReceived(Message message, int left) { switch (message.getConversationType()){ case PRIVATE: //单聊 Log.d("MyReceiveMessage", "--单聊"); break; case GROUP: //群组 Log.d("MyReceiveMessage", "--群组"); break; case DISCUSSION: //讨论组 Log.d("MyReceiveMessage", "--讨论组"); break; case CHATROOM: //聊天室 Log.d("MyReceiveMessage", "--聊天室"); break; case CUSTOMER_SERVICE: //客服 Log.d("MyReceiveMessage", "--客服"); break; case SYSTEM: //系统会话 Log.d("MyReceiveMessage", "--系统会话"); break; default: break; } return false; } } /** * 自定义聊天会话的模型类 */ @ConversationProviderTag(conversationType = "private", portraitPosition = 1) static public class MyPrivateConversationProvider extends PrivateConversationProvider { @Override public View newView(Context context, ViewGroup group) { return super.newView(context, group); } @Override public void bindView(View v, int position, UIConversation data) { if(data.getConversationType().equals(Conversation.ConversationType.PRIVATE)) { data.setUnreadType(UIConversation.UnreadRemindType.REMIND_ONLY); //设置会话发送者ID、会话标题、会话头像URL String userID = data.getConversationSenderId(); UserInfo info = FriendInfoList.getInstance().getUserInfoByUserId(userID); data.setIconUrl(info.getPortraitUri()); data.setUIConversationTitle(info.getName()); FriendInfoList.getInstance().refreshUserInfo(userID); } super.bindView(v, position, data); } }在设置了会话消息后,需要刷新当前的即时通信信息(FriendInfoList.getInstance().refreshUserInfo(userID))
RongIM.getInstance().refreshUserInfoCache(localUserInfo);五、进行App与融云服务器的连接(这里的token为融云服务器token),这样就建立了会话通信的通道
//融云连接 RongMessageHandling.connect(getApplicationContext(), MyApplication.getInstance().getRongKey(), getApplicationInfo());六、动态构建ConversationListActivity
1、activity_conversation_list.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/nc_bg" android:orientation="vertical"> <FrameLayout android:id="@+id/rong_container" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>2、ConversationListActivity.java( ConversationActivity.java同理)
public class ConversationListActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_conversation_list);setConversationView();} void setConversationView(){ ConversationListFragment conversationListFragment = new ConversationListFragment(); Uri uri = Uri.parse("rong://" + getApplicationInfo().packageName).buildUpon() .appendPath("conversationlist") //设置私聊会话,该会话聚合显示 .appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(), "false") //设置系统会话,该会话非聚合显示 .appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "true") .build(); conversationListFragment.setUri(uri); FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.add(R.id.rong_container,conversationListFragment); transaction.commit(); }}
3、Manifest设置(android:host="包名")
<!--会话列表界面--> <activity android:name=".ui.ConversationListActivity" 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="io.rong.fast" android:pathPrefix="/conversationlist/" android:scheme="rong" /> </intent-filter> </activity> <!--会话界面--> <activity android:name=".ui.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="xxx.xxx.xxx" android:pathPrefix="/conversation/" android:scheme="rong" /> </intent-filter> </activity>七、在此,可以进行基本的会话了