安卓融云SDK的使用,会话列表,1v1发起单聊

1v1发起单聊 继承ConversationFragment

前提把融云该导入的SDK和UI包都导入一下,这个不多说,按照官方文档即可

不管是会话列表还是1v1单聊都要先连接融云的服务器

String token = "用户Token";//可以从自己后端服务器获得
RongIM.connect(token, new RongIMClient.ConnectCallback() {
    @Override
    public void onDatabaseOpened(RongIMClient.DatabaseOpenStatus code) {
        //消息数据库打开,可以进入到主页面
    }

    @Override
    public void onSuccess(String s) {
        //连接成功
    }

    @Override
    public void onError(RongIMClient.ConnectionErrorCode errorCode) {
        if(errorCode.equals(RongIMClient.ConnectionErrorCode.RC_CONN_TOKEN_INCORRECT)) {
            //从 APP 服务获取新 token,并重连
        } else {
            //无法连接 IM 服务器,请根据相应的错误码作出对应处理
        }
    }
})

启动单聊页面 哪里调用写哪里

       			//启动单聊会话页面 在哪里点击的就在哪里调用
                Conversation.ConversationType conversationType =Conversation.ConversationType.PRIVATE;
                //RongyunUserID RongyunUserName 对方信息
                String targetId = RongyunUserID;//这个是对方的id
                String title =RongyunUserName;//这个可以设置对方的名字
                Bundle bundle = new Bundle();
                if (!TextUtils.isEmpty(title)) {
                    bundle.putString(RouteUtils.TITLE, title); //会话页面标题
                }
                RouteUtils.routeToConversationActivity(OneChatActivity.this, conversationType, targetId, bundle);

**因为我是通过Fragment的方式进行发起会话页面的所以 要先有一个Activity的fragment进性承接

	public class UserChatActivity extends BaseActivity {
		//获取对方的id和名字 
        Bundle bundle = getIntent().getExtras();
        String name = bundle.getString(RouteUtils.TITLE,"");//名字
        String targetId = bundle.getString(RouteUtils.TARGET_ID);//id
        //获取完之后对方的信息 你可以用在自己定义的Toobar上
        toolbarTitle.setText(name);
    
    	//添加会话页面
        ConversationFragment conversationFragment = new ConversationFragment();
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.container, conversationFragment);
        transaction.commit();
	}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" 
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</LinearLayout>

**不要忘记在Application中初始化 AndroidManifest调用

  		//注册融云会话页面
        RouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationActivity, UserChatActivity.class);

会话列表 ConversationListFragment

上面说过先连接融云服务器,如果上面连接过,这个不用连接了

**会话列表用Activity和Fragment都可以 这个以fragment为例
替换Fragment的过程跟上面一样

	//添加会话页面
        ConversationListFragment conversationListFragment = new ConversationListFragment ();
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.container, conversationListFragment );
        transaction.commit();
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" 
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</LinearLayout>

下面是替换过后 也要进在Application中初始化

   //会话列表
        RouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationListActivity, MyConversationListActivity.class);

重要的部分来了

1.1v1聊天后会话页面列表所有的人的id和头像一样
2.而且只显示id
解决如下
融云列表是需要设置信息的

   		//连接融云成功后设置当前用户的信息 缓存到本地,
        // 如果没有会getUserInfo回调进行访问接口, 从App服务端获取列表某个userId的用户信息
        RongUserInfoManager.getInstance().setUserInfoProvider(new UserDataProvider.UserInfoProvider() {

            /**
             * 获取设置用户信息. 通过返回的 userId 来封装生产用户信息.
             * @param userId 用户 ID
             */
            @Override
            public UserInfo getUserInfo(String userId) {
                //异步请求
                findUserByIdFromServer(userId);
                return null;
            }

        }, true);
    }

#此方法是访问后端根据用户/融云id获取信息,需要后端来提供接口查询用户的信息,
而且上面的getUserInfo会多次进行回调接口,不用担心会话列表用户多的问题


 private void findUserByIdFromServer(String userId) {
        Map<String, String> map = new HashMap<>();
        map.put("userId",userId);
        addSubscribe(createAdd(APIsimap.class).getAllUserinfo(map),
                new BaseObserver<RongYunUserBean.DataBean>(){
                    @Override
                    protected void onFail(int code, String message) {
                    }

                    @Override
                    protected void onSuccess(RongYunUserBean.DataBean data, String message) {
                        //获取成功后set
                        UserInfo myUserInfo = new UserInfo(String.valueOf(data.id()), data.name(), Uri.parse("图片的地址"));
                        //这个方法是融云设置缓存到本地
                        RongIM.getInstance().refreshUserInfoCache(myUserInfo);
                    }

                });
    }

然后点击列表的某个用户,在跳到单聊的那个页面可以这样接收id,在进行查询后端接口拿出数据即可

 String targetId= getIntent().getStringExtra("targetId");

在这里插入图片描述

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐