注册

android 环信集成聊天界面,消息列表界面 都需要设置头像和昵称的功能,不知道怎么做

网上看到很多人用easeui 里面的EaseChatFragment实现聊天界面,
EaseConversationListFragment实现联系人界面,我现在项目中需要实现头像和昵称的设置,发现网上设置头像的都是在环信的demo中去改,难道我要把环信demo 中类都拷贝到自己的项目中吗,我发现需要拷贝很多类,还是全部拷贝进去,网上说需要修改demohelper 这个类 。 求大神指导下 我该怎么实现
已邀请:
设置用户信息提供者就可以了.
 
1.写一个用户信息数据库打开帮助类
 
/**
* @author H-Mo
* @Time 17/4/18 19:18
* @Desc 用户信息数据库打开帮助类
*/
public class EMUserInfoDBOpenHelper extends SQLiteOpenHelper {

public static final String DB_NAME = "userInfo.db";
public static final int DB_VERSION = 1;
public static final String TABLE_NAME = "userInfo";

public EMUserInfoDBOpenHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table "+TABLE_NAME
+" (id integer primary key autoincrement,userId varchar(20),name varchar(20),icon varchar(20))");
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

}
}
2.写出DAO
/**
* @author H-Mo
* @Time 17/4/18 19:37
* @Desc EaseUI用户信息DAO
*/
public class EMUserInfoDAO {

private EMUserInfoDBOpenHelper mHelper;

public EMUserInfoDAO(Context context) {
mHelper = new EMUserInfoDBOpenHelper(context);
}

/**
* 缓存一条记录,线程安全的
* @param id
* @param name
* @param icon
*/
public synchronized void save(@NonNull String id, @NonNull String name, @Nullable String icon){
// id、name为空就不往下执行了
if(TextUtils.isEmpty(id) || TextUtils.isEmpty(name)){
return;
}
// 先查询数据库有没有这个记录
EMUserInfo info = query(id);
if(info == null){
// 插入一条新的
add(id,name,icon);
}else {
// 判断是否一致,如果没有改变就不需要更新
// TODO
// 更新这个数据
update(id,name,icon);
}
}

/**
* 增加一条记录
* @param id 账号
* @param name 昵称
* @param icon 头像URL
*/
public void add(String id,String name,String icon){
// 打开数据库,写
SQLiteDatabase db = mHelper.getWritableDatabase();
// 封装参数
ContentValues value = new ContentValues();
value.put("userId",id);
value.put("name",name);
value.put("icon",icon);
// 执行写入
db.insert(EMUserInfoDBOpenHelper.TABLE_NAME,null,value);
// 关闭数据库
db.close();
}

/**
* 修改一条记录
* @param id
* @param name
* @param icon
*/
public void update(String id,String name,String icon){
// 打开数据库,写
SQLiteDatabase db = mHelper.getWritableDatabase();
// 封装参数
ContentValues value = new ContentValues();
value.put("name",name);
value.put("icon",icon);
// 执行修改
db.update(EMUserInfoDBOpenHelper.TABLE_NAME, value,"userId = ?",new String[]{""+id});
// 关闭数据库
db.close();
}

/**
* 通过账号ID查询一条记录
* @param id
* @Return
*/
public EMUserInfo query(String id){
// 打开数据库,读
SQLiteDatabase db = mHelper.getReadableDatabase();
// 处理条件
String selection = " userId = ? ";
String[] selectionArgs = new String[]{id};
// 执行查询
Cursor cursor = db.query(EMUserInfoDBOpenHelper.TABLE_NAME,
new String[]{},
selection,
selectionArgs,
null, null, null);
// 处理数据
EMUserInfo emUserInfo = null;
if(cursor.moveToNext()){
emUserInfo = new EMUserInfo();
String title = cursor.getString(cursor.getColumnIndex("userId"));
emUserInfo.setUserId(title);

String desc = cursor.getString(cursor.getColumnIndex("name"));
emUserInfo.setName(desc);

String date = cursor.getString(cursor.getColumnIndex("icon"));
emUserInfo.setIcon(date);
}
cursor.close();
// 返回数据
return emUserInfo;
}

}
3.在你的APP的 MxApplication 中设置用户信息提供者
        EaseUI.getInstance().setUserProfileProvider(new EaseUserProfileProvider() {

@Override
public EaseUser getUser(String username) {
return getUserInfo(username);
}
});
4.getUserInfo()方法中查询数据库,数据库没有就联网获取
    private EaseUser getUserInfo(String username){
// 创建对象
EaseUser easeUser = new EaseUser(username);
// 先从本地数据库中查找数据
EMUserInfoDAO dao = new EMUserInfoDAO(mContext);
EMUserInfo userInfo = dao.query(username);
if(userInfo != null){
easeUser.setNick(userInfo.getName());
easeUser.setAvatar(userInfo.getIcon());

return easeUser;
}
// 本地数据库没有,就子线程联网请求一条数据
updateUserInfo(username);
// 暂时返回ID作为昵称
easeUser.setNick(username);
easeUser.setAvatar(FileURLBuilder.getUserIconUrl(username));

return easeUser;
}

// 更新这个用户的信息
protected void updateUserInfo(final String id) {
// 再联网从服务器查询
String url = GlobalConfig.URL_seachUserByUser; //请求地址
// 请求数据
Map<String, String> params = new HashMap<String, String>();
params.put("account", id);
HttpUtils.get().doPOST(url, params, new NetRequestListener<String>() {
@Override
public void onResponse(String result) {
// 解析数据
List<User> users = JsonUtil.parseList(result, User.class);
if(users.size() == 0){
return;
}
User user = users.get(0);
// 缓存数据
EMUserInfoDAO dao = new EMUserInfoDAO(mContext);
dao.save(id,user.getUserName(),FileURLBuilder.getUserIconUrl(id));
}
});
}
注意:getUser(String username)调用是在主线程的,所以联网获取昵称头像需要异步执行.
 
---------------------------------------------
此时,已经可以显示昵称和头像了.不过还有些问题,就是当用户修改昵称和头像的时候,本地数据库没有及时更新数据.
 
---------------------------------------------
 
4.写个 MyChatFragment 继承 EaseChatFragment 并设置聊天界面的监听
 
     @Override
protected void setUpView() {
// 设置聊天界面的监听,需要在父类 onActivityCreated 之前设置监听
setChatFragmentListener(this);
super.setUpView();
}
5.发送消息的时候,吧当前用户的昵称,头像携带进去
 
    // 在这个方法设置拓展消息
@Override
public void onSetMessageAttributes(EMMessage message) {
// 先拿到当前用户的信息
SharedPreferences sp = getActivity().getSharedPreferences("account", Context.MODE_PRIVATE);
String id = sp.getString("account", "");
String name = sp.getString("userName", "");
String icon = FileURLBuilder.getUserIconUrl(id);
// id,name不能为空
if(TextUtils.isEmpty(id) || TextUtils.isEmpty(name)){
return;
}
// 携带进消息里面去
message.setAttribute(DemoHelper.USER_ID,id);
message.setAttribute(DemoHelper.USER_NAME,name);
message.setAttribute(DemoHelper.USER_ICON,icon);
}

6.接受到消息的时候,取出昵称,头像,保存到数据库
 
     // 环信的消息监听
private EMMessageListener mMessageListener = new EMMessageListener(){

// 收到消息
@Override
public void onMessageReceived(List<EMMessage> list) {
android.util.Log.i("mo--", "接收到一条消息");
// 每次收到消息,都要刷新会话列表
EventBus.getDefault().post(new ConversationsListRefreshEvent());
// 拿出消息里面携带的昵称、头像
for (EMMessage message: list) {
String userId = "";
String name = "";
String icon = "";
try {
userId = message.getStringAttribute(DemoHelper.USER_ID);
name = message.getStringAttribute(DemoHelper.USER_NAME);
icon = message.getStringAttribute(DemoHelper.USER_ICON);
} catch (HyphenateException e) {
e.printStackTrace();
// 只要有一个取不出来,就放弃缓存这条信息携带的昵称、头像
continue;
}
// 缓存昵称、头像
EMUserInfoDAO dao = new EMUserInfoDAO(IndexActivity.this);
dao.save(userId,name,icon);
}
}

// 收到透传消息
@Override
public void onCmdMessageReceived(List<EMMessage> list) {

}

// 收到已读回执
@Override
public void onMessageRead(List<EMMessage> list) {

}

// 收到已送达回执
@Override
public void onMessageDelivered(List<EMMessage> list) {

}

// 消息状态变动
@Override
public void onMessageChanged(EMMessage emMessage, Object o) {

}
};
到此,完成.

要回复问题请先登录注册