近来公司要做环信的即时通信,发现公司想要聊天的功能基本上QQ都有,这样就显得有点不怎么现实:人家作几年?咱才多少时间?算了,还好环信也做了几年了。走多远就看自己在这个功能里泡多久吸收多少,有点耐心总能把这段路走完。
集成环信有两种方法,
1 集成环信的SDK,好处是可以用环信的功能,自己的界面
2 引用EaseUI,好处是使用环信的界面和功能,节约时间。
两种方法各有千秋,看自己的选择。
本来是懒省事集成的整个环信的demo,修改页面添加自己的功能。但是公司新来的大神要求有自己的特色,不得不重新来过选择集成sdk使用功能和自定义界面。
http://www.imgeek.org/video/44 环信的sdk视频教程。当然,我写的是自己的理解谢谢。
提前准备:
1 加入SDK以后,需要appkey的配置。
2 初始化,需要放在其他sdk初始化方法之前,也就是说环信的sdk初始化是第一个。
初始化方法: EMClient.getInstance().init(context,options);
其中Options这个参数主要SDK初始化的一些配置,这里可以配置一些初始化SDK的定义,比如
//设置自动登录 opthions.setAutoLogin(true);
//设置(主动或者被动)退出群组的时候,是否删除群聊天记录
options.setDeleteMessageAsExitGroup(false);
为什么不删除?人家的聊天毕竟是人家的,能不删就别删。
其他详细需要查看的,API文档:
http://www.easemob.com/apidoc/android/chat3.0/classcom_1_1hyphenate_1_1chat_1_1_e_m_options.html
注册于登录:
注册的方法,是同步的,需要自己有执行,根据执行情况判断是否注册成功
EMClitent,getInstance().createAccount( 名称,密码);//一般放在服务器执行。
登录方法,异步,可在回调中监听登录状态
EMClient.getInstance().login(名字,密码,callback);
退出登录的方法,第一个参数表示是否解绑推送的token,没有使用推送或者被踢都要传false
EMCliten.getInstance().logout(false,callback);
集成聊天:
聊天主要就是消息的接受和发送:
发送比较简单,只要创建消息,调用发送方法就可以。
接受需要实现消息的箭筒借口EMMessageListener, 这个监听接口可以在多处实现。
一般是在全局一个实现,一个是在聊天界面。这里主要在聊天界面实现:
实现这个接口需要实现几个借口的方法:
//收到消息
public void onMessageReceived(List<Message> list);
//收到新的CMD消息
public void onCMDMessageReceived(List<Message> list);
//收到新的已读回执
public void onMessageReadAckReceived(List<Message> list);
//收到新的发送回执
public void onMessageDeliveryAckReceived(List<Message> list);
//消息的状态改变
public void onMessageChanged(EMMessage message,Object object);
Github 代码地址
https://github.com/lzan13/EaseChat 注意 master是集成SDK的。
下载SDK之后解压,doc文件是环信的离线文档,方便离线查看。
libs是包含环信的聊天和及时语音和视频通话功能,现在就是要用这里的jar包
copy jar包和so库文件,x86是给模拟器用的。
因为用studio的时候懒得去见jni,所以需要去配置一下: 看好位置
开始配置项目
根据官方文档:
1 权限 2 需要的服务 3 appkey
准备工作完成以后,同步一下就开始写代码
1 初始化SDK,需要在自定义的Application中写,这样就可以运行就初始化。
public class MyApplication
extends Application {
private Context
context;
private String
TAG =
"log";
@Override
public void onCreate() {
super.onCreate()
;
initDate()
;
initView()
;
}
private void initDate() {
context =
this;
int pid = android.os.Process.
myPid()
;
String processAppName = getAppName(pid)
;
// 如果APP启用了远程的service,此application:onCreate会被调用2次
// 为了防止环信SDK被初始化2次,加此判断会保证SDK被初始化1次
// 默认的APP会在以包名为默认的process name下运行,如果查到的process name不是APP的process name就立即返回
if (processAppName ==
null ||!processAppName.equalsIgnoreCase(
context.getPackageName())) {
Log.
e(
TAG, "enter the service process!")
;
// 则此application::onCreate 是被service 调用的,直接返回
return;
}
}
private void initView() {
EMOptions options =
new EMOptions()
;
// 默认添加好友时,是不需要验证的,改成需要验证
options.setAcceptInvitationAlways(
false)
;
//初始化
EMClient.
getInstance().init(
this, options)
;
//在做打包混淆时,关闭debug模式,避免消耗不必要的资源
EMClient.
getInstance().setDebugMode(
true)
;
}
private String
getAppName(
int pID) {
String processName =
null;
ActivityManager am = (ActivityManager)
this.getSystemService(
ACTIVITY_SERVICE)
;
List l = am.getRunningAppProcesses()
;
Iterator i = l.iterator()
;
PackageManager pm =
this.getPackageManager()
;
while (i.hasNext()) {
ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo) (i.next())
;
try {
if (info.
pid == pID) {
processName = info.
processName;
return processName
;
}
}
catch (Exception e) {
// Log.d("Process", "Error>> :"+ e.toString());
}
}
return processName
;
}
}
写完记得在清单文件中声明这个自定义的Application。
android:name=".application.MyApplication"
2 第二步开始写登录和注册的界面,自己刚开始没必要做多完美先坐在同一个界面。怎么写就不说了
注册是个同步的方法,需要异步处理,在点击开始注册的时候开启子线程。
登录不用开启子线程,注意不论是注册还是登陆失败的时候都需要处理下打印个日志。
转载请注明原文地址: https://ju.6miu.com/read-36543.html