写在前面:普通的应用中一般只用到传输文件,发送文字图片信息,所以此处不做语音视频通讯的集成,够用就行,红色字体基本是都是坑,大家注意了
由于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);//同步方法
- 注意: 登录成功后需要调用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
- //当前网络不可用,请检查网络设置
- }
- }
- });
- }
- }