融云-用户信息提供者解析


使用融云的用户信息提供者,可以先看一下融云 官网的用户信息提供者文档和视频,做一个大概的了解。


这篇文章主要讲解一下用户信息提供者的使用疑问和一些使用场景

疑问:

1,用户信息提供者干嘛用的?

2,用户信息提供者提供的是我自己的数据吗?

场景:

1,进入会话列表前,我未向用户信息提供者提供数据?

2,与一个不认识人的聊天,我需要用异步的方法加载用户信息,可以融云提供的 getUserInfo 方法中没有回调方法,我如何刷新会话中的 UserInfo?


主要针对这 4 个问题进行讲解,讲解之前默认你已经集成了融云 SDK,此处对集成的过程不再 bb


1.用户信息提供者干嘛用的?

用户信息提供者的设定是为了在会话列表和会话页面显示用户信息的。

注:还有一种方法不需要设定用户信息提供者,直接使用融云的缓存数据,将用户信息展示出来,此处不考虑这种情况。

2.用户信息提供者提供的是我自己的数据吗?

用户信息提供者提供的不是你一个人的数据,而是你的会话列表和会话页面所要展示的所有 用户的数据。


3.进入会话列表前,我未向用户信息提供者提供数据?

如果在进入会话列表前,不提供用户信息给用户信息提供者,你的会话列表和会话页面将不会展示出用户的 头像和昵称。

还有一些情况是你的会话列表,只能显示一些人的 昵称和头像,那一定是你未将不显示头像和昵称的用户信息提供给 用户信息提供者。这块需要你查看一下你自己的代码,如果提供数据给融云,以及提供什么数据给 融云,这些逻辑都是自己的 App 做的。一定要自查!


4.使用异步方法提供用户信息,如何设置用户信息提供者

1.App类

public class App extends Application implements RongIM.UserInfoProvider {
    //测试头像地址
    public static String porUri = "http://jdd.kefu.rongcloud.cn/image/service_80x80.png";

    @Override
    public void onCreate() {
        super.onCreate();
        RongIM.init(this);

        DemoContext.init(this);
        RongIM.setUserInfoProvider(this, true);//设置用户信息提供者。
    }


    @Override
    public UserInfo getUserInfo(String userId) {

        Log.e("app", "---------getUserInfo----userId-------" + userId);

        if (DemoContext.getInstance() == null)
            return null;

        return DemoContext.getInstance().getUserInfoByUserId(userId);
    }
}

//以下是两个测试账号的信息
/**
 * 56146
 * rjlNearK6Qzu3MxMbMrQPLI6ZiT8q7s0UEaMPWY0lMwZFCr6nvpDtW4C3cjQ9tv4cIQMvwbkJb6xzmBRkFjv+Q==
 * [email protected]
 * 123456
 * rongcloud112
 */

/**
 * 56147
 * ke0BCyqQnwWiagWoS1ckzrI6ZiT8q7s0UEaMPWY0lMwZFCr6nvpDtX2/KvQEWEDo6r3YdoOyCDqUgN53uY4SEA==
 * [email protected]
 * 123456
 * rongcloud113
 */




2.DemoContext 类,通过 userid 提供 UserInfo 给用户信息提供者。


public class DemoContext {

    private static DemoContext mDemoContext;
    public Context mContext;

    private ArrayList<UserInfo> mUserInfos;

    public static void init(Context context) {
        mDemoContext = new DemoContext(context);
    }

    public static DemoContext getInstance() {

        if (mDemoContext == null) {
            mDemoContext = new DemoContext();
        }
        return mDemoContext;
    }

    private DemoContext() {

    }

    private DemoContext(Context context) {
        mContext = context;
        mDemoContext = this;

    }

    public ArrayList<UserInfo> getmUserInfos() {
        return mUserInfos;
    }

    public void setmUserInfos(ArrayList<UserInfo> mUserInfos) {
        this.mUserInfos = mUserInfos;
    }


    public UserInfo getUserInfoByUserId(String userId) {

        UserInfo userInfoReturn = null;

        if (!TextUtils.isEmpty(userId) && mUserInfos != null) {
            for (UserInfo userInfo : mUserInfos) {

                if (userId.equals(userInfo.getUserId())) {
                    userInfoReturn = userInfo;
                    break;
                }
            }
        }
        return userInfoReturn;
    }
}

3,测试方法:首先需要你有两个账号,并可以互现发送消息。首先 用户A 向 用户B 发送消息,用户B未实现用户A 的用户信息,这时候在会话列表显示的消息是用户 A 的默认头像 和 userid 信息。

在 MainActivity 中添加一个 button,当你点击这个 button 的时候,会提供账号A的 userinfo 的信息给到用户 B 的用户信息提供者。调用 RongIM.getInstance().refreshUserInfoCache 可以刷新会话列表。

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button bt1 = (Button) findViewById(R.id.bt1);
        Button bt2 = (Button) findViewById(R.id.bt2);

        ConversationListFragment fragment = (ConversationListFragment) getSupportFragmentManager().findFragmentById(R.id.conversationlist);

        Uri uri = Uri.parse("rong://" + getApplicationInfo().packageName).buildUpon()
                .appendPath("conversationlist")
                .appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(), "false") //设置私聊会话非聚合显示
                .appendQueryParameter(Conversation.ConversationType.GROUP.getName(), "false")//设置群组会话聚合显示
                .appendQueryParameter(Conversation.ConversationType.DISCUSSION.getName(), "false")//设置讨论组会话非聚合显示
                .appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "false")//设置系统会话非聚合显示
                .build();

        fragment.setUri(uri);
        

        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TextMessage textMessage = TextMessage.obtain("hehe");
                if (RongIM.getInstance() != null && RongIM.getInstance().getRongIMClient() != null)
                    RongIM.getInstance().getRongIMClient().sendMessage(Conversation.ConversationType.PRIVATE, "56147", textMessage, null, null, new RongIMClient.SendMessageCallback() {
                        @Override
                        public void onError(Integer integer, RongIMClient.ErrorCode errorCode) {
                            Log.e("MainActivity", "--发送消息失败");
                        }

                        @Override
                        public void onSuccess(Integer integer) {
                            Log.e("MainActivity", "--发送消息成功");
                        }
                    });
            }
        });

        bt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                List<UserInfo> userInfoList = new ArrayList<UserInfo>();
                UserInfo userInfo = new UserInfo("56147", "测试哈哈", Uri.parse(App.porUri));
                userInfoList.add(userInfo);
                DemoContext.getInstance().setmUserInfos((ArrayList<UserInfo>) userInfoList);
                RongIM.getInstance().refreshUserInfoCache(userInfo);
            }
        });
    }
}


这个方法测试了,异步加载的问题。所以不要再去纠结 同步和异步的调用。


demo链接:

http://download.csdn.net/detail/duqiuke/9347579



你可能感兴趣的:(用户信息提供者)