写在前面:普通的应用中一般只用到传输文件,发送文字图片信息,所以此处不做语音视频通讯的集成,够用就行,红色字体基本是都是坑,大家注意了
由于easeui bug太多,集成繁琐,不符合项目要求,所以自己写了一个,界面也是自己写的,其实自己写挺容易的,没想象的难,多看看官方文档,其实挺详细的,方法的使用也很简单,有点耐心是完全没问题的,主要是准备工作需要做好了,下面我写的很详细,但是后面的不详细,大家参照官方文档吧,肯定没问题的
1.准备工作
- 注册账号下载sdk等,官网说的很明确,我就不啰嗦了
- jar文件,so文件引入,如下图,文件路径不要弄错了,当然可以有其他方法,但这是最简单的方式,这样的文件路径她会自动识别jar文件和so文件
- 配置清单文件,配置自己的appkey(只有这一个是需要自己配置的,其他复制即可)即可其他都不需要手动配置直接复制,官网上直接复制代码即可
- 引入easeui库,huanxin_IM_sdk_V3.1.2r2\examples\easeui在这个目录下,把easeui文件夹单独复制出来,引入步骤如下,然后必须需在project structure菜单下面添加module依赖,否则报错
- 初始化sdk,参考环信官网指南,已经很详细了,而且也很简单,记得要在清单文件中配置自己的application类
2.注册,登录
1.注册,引用一下官方的说法
注册模式分两种,开放注册和授权注册。只有开放注册时,才可以客户端注册。
开放注册是为了测试使用,正式环境中不推荐使用该方式注册环信账号;
授权注册的流程应该是您服务器通过环信提供的 REST API 注册,之后保存到您的服务器或返回给客户端。
注册用户名会自动转为小写字母,所以建议用户名均以小写注册。(强烈建议开发者通过后台调用 REST 接口去注册环信 ID,客户端注册方法不提倡使用。)
//注册失败会抛出HyphenateException
EMClient.getInstance().createAccount(username, pwd);//同步方法
2.登录,同样官方很详细
注意: 登录成功后需要调用EMClient.getInstance().chatManager().loadAllConversations(); 和EMClient.getInstance().groupManager().loadAllGroups();。
以上两个方法是为了保证进入主页面后本地会话和群组都 load 完毕。
另外如果登录过,APP 长期在后台再进的时候也可能会导致加载到内存的群组和会话为空,可以在主页面的 oncreate 里也加上这两句代码,当然,更好的办法应该是放在程序的开屏页,可参考 Demo 的 SplashActivity。
EMClient.getInstance().login(userName,password,new EMCallBack() {//回调
@Override
public void onSuccess() {
runOnUiThread(new Runnable() {
public void run() {
EMClient.getInstance().groupManager().loadAllGroups();
EMClient.getInstance().chatManager().loadAllConversations();
Log.d("main", "登录聊天服务器成功!");
}
});
}
@Override
public void onProgress(int progress, String status) {
}
@Override
public void onError(int code, String message) {
Log.d("main", "登录聊天服务器失败!");
}
});
自动登录
即首次登录成功后,不需要再次调用登录方法,在下次 APP 启动时,SDK 会自动为您登录。并且如果您自动登录失败,也可以读取到之前的会话信息(以上情况是在未调用登出的情况下实现的)。
SDK 中自动登录属性默认是 true 打开的,如果不需要自动登录,在初始化 SDK 初始化的时候,调用options.setAutoLogin(false);设置为 false 关闭。
自动登录在以下几种情况下会被取消:
用户调用了 SDK 的登出动作;
用户在别的设备上更改了密码,导致此设备上自动登录失败;
用户的账号被从服务器端删除;
用户从另一个设备登录,把当前设备上登录的用户踢出。
登录页面loginActivity代码如下:
package com.z.hx;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.hyphenate.EMCallBack;
import com.hyphenate.EMError;
import com.hyphenate.chat.EMClient;
import com.hyphenate.exceptions.HyphenateException;
import com.z.hx.utils.ToastUtil;
public class LoginActivity extends AppCompatActivity {
private android.widget.EditText etusername;
private android.widget.EditText etpassword;
private android.widget.Button btnlogin;
private android.widget.Button btnregist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
this.btnlogin = (Button) findViewById(R.id.login);
this.etpassword = (EditText) findViewById(R.id.pwd);
this.etusername = (EditText) findViewById(R.id.uname);
this.btnregist = (Button) findViewById(R.id.regist);
btnlogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//登录成功进入到回话列表页面
EMClient.getInstance().login(etusername.getText().toString(), etpassword.getText().toString(), new EMCallBack() {//回调
@Override
public void onSuccess() {
runOnUiThread(new Runnable() {
public void run() {
EMClient.getInstance().groupManager().loadAllGroups();
EMClient.getInstance().chatManager().loadAllConversations();
startActivity(new Intent(getApplicationContext(), MainActivity.class));
ToastUtil.showToast(getApplicationContext(), "登录成功");
Log.d("main", "登录聊天服务器成功!");
}
});
}
@Override
public void onProgress(int progress, String status) {
}
@Override
public void onError(int code, String message) {
Log.d("main", "登录聊天服务器失败!");
}
});
}
});
btnregist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//注册成功之后提示成功,失败就提示失败,以及失败原因
//注册失败会抛出HyphenateException
try {
EMClient.getInstance().createAccount(etusername.getText().toString(), etpassword.getText().toString());//同步方法
ToastUtil.showToast(getApplicationContext(), "注册成功,用户名是:" + etusername.getText().toString() + ",开始畅快聊天吧");
} catch (HyphenateException e) {
e.printStackTrace();
//此处我们根据错误类型可以判断是什么原因引起的注册失败,我们只列出常见的原因1.网络连接失败2.用户名已注册
//http://www.easemob.com/apidoc/android/chat3.0/classcom_1_1hyphenate_1_1_e_m_error.html这是官方的文档,这里有各种错误代码,供我们参考
switch (e.getErrorCode()) {
case EMError.SERVER_BUSY:
case EMError.SERVER_UNKNOWN_ERROR:
case EMError.SERVER_NOT_REACHABLE:
case EMError.SERVER_TIMEOUT:
case EMError.NETWORK_ERROR://网络错误
ToastUtil.showToast(getApplicationContext(), "网络有问题,请稍后再试");
break;
case EMError.USER_ALREADY_EXIST://用户名已存在
ToastUtil.showToast(getApplicationContext(), "用户名已存在,请尝试登录");
break;
case EMError.USER_REG_FAILED://注册失败
Toast.makeText(getApplicationContext(), "注册失败", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
});
}
}
坑:在登录成功是弹出toast不成功,直接崩溃
原因:登录注册方法是在子线程中运行的,toast在子线程不成功,可以自己判断是否在子线程然后再toast,后面会专门写这个专题,这里不多说了
3.聊天界面开发
首先:注册连接状态监听
当掉线时,Android SDK 会自动重连,无需进行任何操作,通过注册连接监听来知道连接状态。
在聊天过程中难免会遇到网络问题,在此 SDK 为您提供了网络监听接口,实时监听
可以根据 disconnect 返回的 error 判断原因。若服务器返回的参数值为EMError.USER_LOGIN_ANOTHER_DEVICE,则认为是有同一个账号异地登录;若服务器返回的参数值为EMError.USER_REMOVED,则是账号在后台被删除。
//注册一个监听连接状态的listener
EMClient.getInstance().addConnectionListener(new MyConnectionListener());
//实现ConnectionListener接口
private class MyConnectionListener implements EMConnectionListener {
@Override
public void onConnected() {
}
@Override
public void onDisconnected(final int error) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if(error == EMError.USER_REMOVED){
// 显示帐号已经被移除
}else if (error == EMError.USER_LOGIN_ANOTHER_DEVICE) {
// 显示帐号在其他设备登录
} else {
if (NetUtils.hasNetwork(MainActivity.this))
//连接不到聊天服务器
else
//当前网络不可用,请检查网络设置
}
}
});
}
}
坑:appkey一定要写对,要不然一进去就会崩,在application类中就崩了,一般集成第三方的东西都是这样的,但是环信比较奇葩不告诉你是appkey不对,让你猜的,哎
剩下的内容我就不贴出来了,有demo环信集成demo下载