Android平台环信IM开发实战案例
来源:互联网 发布:淘宝级别的等级划分 编辑:程序博客网 时间:2024/06/05 18:11
Android SDK导入
集成前准备
注册环信开发者账号
在环信官网上点击注册,跳转到环信管理后台注册页面,如下图:
在注册页面中填写详细资料,如下图:企业ID,只限于数字,字母,横线,且不能以横线开头和结尾。企业ID会存在于生成的APPKEY中,如:测试demo中 APPKEY为easemob-demo#chatdemo,则easemob-demo为填写的企业ID)注:如果是个人应用开发的话,企业ID直接写成自己定义的ID就可以
点击注册,注册成功后,我们会向您填写的邮箱中发送验证信息,请前往邮箱进行账号激活。
创建应用
账号激活成功后,回到控制台登录页面登录到开发者后台,在我的应用中,点击创建应用按钮,如下图:
填写创建应用的名称(内容只限于数字,大小写字母),如下图:(应用名称会存在于你生成的APPKEY中,如:测试demo中 APPKEY为easemob-demo#chatdemo,则chatdemo为填写的应用名称。注册授权根据需要自行选择)
填写好应用名称后,点确定,创建成功,系统会为你生成APPKEY以及相关配置信息,如下图
将此appkey配置到android,ios,webim上即可
名词 解释 org_name 企业的唯一标识,开发者在环信开发者管理后台注册账号时填写的企业ID app_name 同一”企业”下”app”唯一标识,开发者在环信开发者管理后台创建应用时填写的”应用名称” org_admin 开发者在环信开发者管理后台注册时填写的”用户名”.企业管理员拥有对该企业账号下所有资源的操作权限 appkey 一个app的唯一标识,规则是 ${org_name}#${app_name}
快速上手常用解决方案
1)用户和好友体系集成
2)通信过程及聊天记录保存
3)昵称和头像的显示与更新
4)群聊
5)数据平滑迁移
6)环信群聊@功能的实现
7)实时消息回调
下载SDK
到环信官网下载环信SDK.
注:考虑到开发者需求不一样,在下载的SDK中,提供了两个不同的jar包:
SDK目录讲解
从官网上下载下来的包,解压后内容如下:
在这里主要介绍后面四个文件夹内容:
在自行开发的应用中,集成环信聊天需要把libs文件夹下的easemobchat_2.1.6.jar和armeabi目录导入到你的项目的libs文件夹底下,如果不需要语音和视频通话功能,导入libs.without.audio下的jar文件即可。jar名字的后面的2.1.6可能会跟你下载的不一致,这是版本号,以实际为准。如果集成过2.1.6之前sdk的开发者,建议更新新版本,新版本有很多的优化,具体请看更新日志。
注:SDK版本是向下兼容的
以上为2.1.5之前的jar包和.so文件
以上为2.1.5之后的jar包和.so文件(里面包含了语音和视频通话功能)
复制代码
关于EASEMOB_APPKEY对应的value获取,在创建应用后,申请APPKEY并进行相关配置。(环信demo中 APPKEY为easemob-demo#chatdemoui)
Android SDK基础功能
SDK中相关异步/同步处理方法介绍
具体是否异步还是同步,也可以参考相关文档介绍的方法,每一个方法后边都有注释信息提示开发者,未注释的则认为同步执行
注:对于没有回调的异步方法执行过程,是通过try catch来判断异步方法执行成功或者失败
初始化SDK
要求在application的oncreate方法中做初始化
复制代码
注:如果你的app中有第三方的服务启动,请在初始化SDK (EMChat.getInstance().init(applicationContext))方法的前面添加以下相关代码(相应代码也可参考demo的application)
复制代码
如何获取processAppName请参考以下方法
复制代码
注册
注册模式分两种,开放注册和授权注册。只有开放注册时,才可以客户端注册。开放注册是为了测试使用,正式环境中不推荐使用该方式注册环信账号, 授权注册的流程应该是您服务器通过环信提供的rest api注册,之后保存到您的服务器或返回给客户端。注册用户名会自动转为小写字母,所以建议用户名均以小写注册(强烈建议开发者通过后台调用rest接口去注册环信id,客户端注册方法不提倡使用)
复制代码
登录
登陆聊天服务器需要注意: 登陆成功后需要调用
复制代码
从本地数据库加载群组到内存的操作,如果你的应用中有群组,请加上这句话(要求在每次进入应用的时候调用)
复制代码
从本地数据库加载聊天记录到内存的操作(强烈建议在每次进入应用的时候调用) 以上两个方法是为了保证进入主页面后本地会话和群组都load完毕。另外如果登陆过,app长期在后台再进的时候也可能会导致加载到内存的群组和会话为空,可以在主页面的oncreate里也加上这两句代码,当然,更好的办法应该是放在程序的开屏页,可参考demo的SplashActivity。
复制代码
自动登录
即首次登录成功后,不需要再次调用登录方法,在下次app启动时,SDK会自动为您登录。并且如果您自动登录失败,也可以读取到之前的会话信息(以上情况是在未调用登出的情况下实现的)。 配置是否进行自动登录。SDK中自动登录属性默认是true打开的,如果不需要自动登录,在初始化SDK之前,调用
复制代码
设置为false关闭
自动登录
自动登录在以下几种情况下会被取消
用户调用了SDK的登出动作;
用户在别的设备上更改了密码, 导致此设备上自动登陆失败;
用户的账号被从服务器端删除;
用户从另一个设备登录,把当前设备上登陆的用户踢出.
复制代码
重连
当掉线时,Android SDK会自动重连,无需进行任何操作。
复制代码
退出聊天登陆
复制代码
IM 开发关键功能点
1) 注册监听
2)单聊
3)好友管理
4)群聊
5)聊天室
6)导入消息到环信数据库
7)实时通话
8)自定义扩展消息
9)消息透传
10)Google推送
11)Demo和SDK下载
12)环信UI demo
app打包混淆
在proguard文件中加入以下keep
复制代码
完整工程源代码可供参考:
1)基于环信类似微信的聊天APP源码
2)环信官方企信源码,见附件
更多有用信息
集成前准备
注册环信开发者账号
在环信官网上点击注册,跳转到环信管理后台注册页面,如下图:
在注册页面中填写详细资料,如下图:企业ID,只限于数字,字母,横线,且不能以横线开头和结尾。企业ID会存在于生成的APPKEY中,如:测试demo中 APPKEY为easemob-demo#chatdemo,则easemob-demo为填写的企业ID)注:如果是个人应用开发的话,企业ID直接写成自己定义的ID就可以
点击注册,注册成功后,我们会向您填写的邮箱中发送验证信息,请前往邮箱进行账号激活。
创建应用
账号激活成功后,回到控制台登录页面登录到开发者后台,在我的应用中,点击创建应用按钮,如下图:
填写创建应用的名称(内容只限于数字,大小写字母),如下图:(应用名称会存在于你生成的APPKEY中,如:测试demo中 APPKEY为easemob-demo#chatdemo,则chatdemo为填写的应用名称。注册授权根据需要自行选择)
填写好应用名称后,点确定,创建成功,系统会为你生成APPKEY以及相关配置信息,如下图
将此appkey配置到android,ios,webim上即可
名词 解释 org_name 企业的唯一标识,开发者在环信开发者管理后台注册账号时填写的企业ID app_name 同一”企业”下”app”唯一标识,开发者在环信开发者管理后台创建应用时填写的”应用名称” org_admin 开发者在环信开发者管理后台注册时填写的”用户名”.企业管理员拥有对该企业账号下所有资源的操作权限 appkey 一个app的唯一标识,规则是 ${org_name}#${app_name}
快速上手常用解决方案
1)用户和好友体系集成
2)通信过程及聊天记录保存
3)昵称和头像的显示与更新
4)群聊
5)数据平滑迁移
6)环信群聊@功能的实现
7)实时消息回调
下载SDK
到环信官网下载环信SDK.
注:考虑到开发者需求不一样,在下载的SDK中,提供了两个不同的jar包:
- 一个是libs下带实时语音功能和实时视频功能的jar包和三个.so文件(jar包大小约为1.34M,三个.so文件文件约为4.76M)
- 如果你不需要实时语音功能,实时视频功能,那就直接用libs.without.audio文件夹下的jar包(jar包大小约为900多K.)
SDK目录讲解
从官网上下载下来的包,解压后内容如下:
在这里主要介绍后面四个文件夹内容:
- doc文件夹:SDK相关API文档
- examples文件夹:ChatDemoUI(为开发者能够更深入理解SDK而提供的一个demo)
- libs文件夹:拥有实时语音,实时视频功能的SDK(大小在1.34M左右)包和.so文件
- libs.without.audio文件夹:无实时语音,实时视频功能的SDK包(大小在900多K)
- 导入SDK
在自行开发的应用中,集成环信聊天需要把libs文件夹下的easemobchat_2.1.6.jar和armeabi目录导入到你的项目的libs文件夹底下,如果不需要语音和视频通话功能,导入libs.without.audio下的jar文件即可。jar名字的后面的2.1.6可能会跟你下载的不一致,这是版本号,以实际为准。如果集成过2.1.6之前sdk的开发者,建议更新新版本,新版本有很多的优化,具体请看更新日志。
注:SDK版本是向下兼容的
以上为2.1.5之前的jar包和.so文件
以上为2.1.5之后的jar包和.so文件(里面包含了语音和视频通话功能)
- 配置信息
复制代码
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="Your Package" android:versionCode="100" android:versionName="1.0.0"> <!-- Required --> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 应用包名及appkey替换: <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:name="Your Application"> <!-- 设置环信应用的appkey --> <meta-data android:name="EASEMOB_APPKEY" android:value="Your AppKey" /> <!-- 声明sdk所需的service SDK核心功能--> <service android:name="com.easemob.chat.EMChatService" /> </application></manifest>
关于EASEMOB_APPKEY对应的value获取,在创建应用后,申请APPKEY并进行相关配置。(环信demo中 APPKEY为easemob-demo#chatdemoui)
Android SDK基础功能
SDK中相关异步/同步处理方法介绍
- 同步方法:在调用SDK里面的方法时,如果方法对应的参数里面有callback回调,直接调用
-
- 异步方法:调用SDK的方法里面没有对应callback参数,则需要开发者来异步操作
具体是否异步还是同步,也可以参考相关文档介绍的方法,每一个方法后边都有注释信息提示开发者,未注释的则认为同步执行
注:对于没有回调的异步方法执行过程,是通过try catch来判断异步方法执行成功或者失败
初始化SDK
要求在application的oncreate方法中做初始化
复制代码
EMChat.getInstance().init(applicationContext); /** * debugMode == true 时为打开,sdk 会在log里输入调试信息 * @param debugMode * 在做代码混淆的时候需要设置成false */EMChat.getInstance().setDebugMode(true);//在做打包混淆时,要关闭debug模式,如果未被关闭,则会出现程序无法运行问题
注:如果你的app中有第三方的服务启动,请在初始化SDK (EMChat.getInstance().init(applicationContext))方法的前面添加以下相关代码(相应代码也可参考demo的application)
复制代码
appContext = 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("com.easemob.chatuidemo")) { Log.e(TAG, "enter the service process!"); //"com.easemob.chatuidemo"为demo的包名,换到自己项目中要改成自己包名 // 则此application::onCreate 是被service 调用的,直接返回 return;}
如何获取processAppName请参考以下方法
复制代码
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) { CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA)); // Log.d("Process", "Id: "+ info.pid +" ProcessName: "+ // info.processName +" Label: "+c.toString()); // processName = c.toString(); processName = info.processName; return processName; } } catch (Exception e) { // Log.d("Process", "Error>> :"+ e.toString()); } } return processName;}
注册
注册模式分两种,开放注册和授权注册。只有开放注册时,才可以客户端注册。开放注册是为了测试使用,正式环境中不推荐使用该方式注册环信账号, 授权注册的流程应该是您服务器通过环信提供的rest api注册,之后保存到您的服务器或返回给客户端。注册用户名会自动转为小写字母,所以建议用户名均以小写注册(强烈建议开发者通过后台调用rest接口去注册环信id,客户端注册方法不提倡使用)
复制代码
new Thread(new Runnable() { public void run() { try { // 调用sdk注册方法 EMChatManager.getInstance().createAccountOnServer(username, pwd); } catch (final EaseMobException e) { //注册失败 int errorCode=e.getErrorCode(); if(errorCode==EMError.NONETWORK_ERROR){ Toast.makeText(getApplicationContext(), "网络异常,请检查网络!", Toast.LENGTH_SHORT).show(); }else if(errorCode==EMError.USER_ALREADY_EXISTS){ Toast.makeText(getApplicationContext(), "用户已存在!", Toast.LENGTH_SHORT).show(); }else if(errorCode==EMError.UNAUTHORIZED){ Toast.makeText(getApplicationContext(), "注册失败,无权限!", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(getApplicationContext(), "注册失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } }
登录
登陆聊天服务器需要注意: 登陆成功后需要调用
复制代码
EMGroupManager.getInstance().loadAllGroups();
从本地数据库加载群组到内存的操作,如果你的应用中有群组,请加上这句话(要求在每次进入应用的时候调用)
复制代码
EMChatManager.getInstance().loadAllConversations();
从本地数据库加载聊天记录到内存的操作(强烈建议在每次进入应用的时候调用) 以上两个方法是为了保证进入主页面后本地会话和群组都load完毕。另外如果登陆过,app长期在后台再进的时候也可能会导致加载到内存的群组和会话为空,可以在主页面的oncreate里也加上这两句代码,当然,更好的办法应该是放在程序的开屏页,可参考demo的SplashActivity。
复制代码
EMChatManager.getInstance().login(userName,password,new EMCallBack() {//回调 @Override public void onSuccess() { runOnUiThread(new Runnable() { public void run() { EMGroupManager.getInstance().loadAllGroups(); EMChatManager.getInstance().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之前,调用
复制代码
EMChat.getInstance().setAutoLogin(false);
设置为false关闭
自动登录
自动登录在以下几种情况下会被取消
用户调用了SDK的登出动作;
用户在别的设备上更改了密码, 导致此设备上自动登陆失败;
用户的账号被从服务器端删除;
用户从另一个设备登录,把当前设备上登陆的用户踢出.
复制代码
EMChat.getInstance().setAutoLogin(false);
重连
当掉线时,Android SDK会自动重连,无需进行任何操作。
复制代码
//注册一个监听连接状态的listenerEMChatManager.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.CONNECTION_CONFLICT) { // 显示帐号在其他设备登陆 } else { if (NetUtils.hasNetwork(MainActivity.this)) //连接不到聊天服务器 else //当前网络不可用,请检查网络设置 } } }); }}
退出聊天登陆
复制代码
EMChatManager.getInstance().logout();//此方法为同步方法 //此方法为异步方法 EMChatManager.getInstance().logout(new EMCallBack() { @Override public void onSuccess() { // TODO Auto-generated method stub } @Override public void onProgress(int progress, String status) { // TODO Auto-generated method stub } @Override public void onError(int code, String message) { // TODO Auto-generated method stub } });
IM 开发关键功能点
1) 注册监听
2)单聊
3)好友管理
4)群聊
5)聊天室
6)导入消息到环信数据库
7)实时通话
8)自定义扩展消息
9)消息透传
10)Google推送
11)Demo和SDK下载
12)环信UI demo
app打包混淆
在proguard文件中加入以下keep
复制代码
-keep class com.easemob.** {*;}-keep class org.jivesoftware.** {*;}-keep class org.apache.** {*;}-dontwarn com.easemob.**#2.0.9后的不需要加下面这个keep#-keep class org.xbill.DNS.** {*;}#另外,demo中发送表情的时候使用到反射,需要keep SmileUtils-keep class com.easemob.chatuidemo.utils.SmileUtils {*;}#注意前面的包名,如果把这个类复制到自己的项目底下,比如放在com.example.utils底下,应该这么写(实际要去掉#)#-keep class com.example.utils.SmileUtils {*;}#如果使用easeui库,需要这么写-keep class com.easemob.easeui.utils.EaseSmileUtils {*;} #2.0.9后加入语音通话功能,如需使用此功能的api,加入以下keep-dontwarn ch.imvs.**-dontwarn org.slf4j.**-keep class org.ice4j.** {*;}-keep class net.java.sip.** {*;}-keep class org.webrtc.voiceengine.** {*;}-keep class org.bitlet.** {*;}-keep class org.slf4j.** {*;}-keep class ch.imvs.** {*;}
完整工程源代码可供参考:
1)基于环信类似微信的聊天APP源码
2)环信官方企信源码,见附件
更多有用信息
0 0
- Android平台环信IM开发实战案例
- 微信开发教程 微信开发案例-深入浅出微信公众平台实战开发
- Android 基于环信即时云的IM开发
- Android 基于环信即时云的IM开发
- Android基于环信SDK开发IM即时聊天
- Android-IM即时通讯:环信
- 微信公众平台开发案例
- Android NDK 开发:实战案例
- 微信公众平台应用开发实战
- 微信公众平台应用开发实战
- 微信公众平台应用开发实战
- 微信公众平台开发实战
- Android- 环信IM即时通讯(1)
- Android- 环信IM即时通讯_RESTAPI(2)
- 环信IM集成到android项目
- 公众号接收用户消息—《微信公众平台开发实战与应用案例》—陈小龙
- Android基于环信SDK开发IM即时聊天(一)
- Android基于环信SDK开发IM即时聊天(二)
- 对Uva 10420 - List of Conquests的文化补充
- xcode工作区间xxxx.xcworkspace不包含xxxx.xcodeproj
- FZU 1901 KMP 有点意思的题了
- 收藏
- Ubuntu如何通过官方PPA安装Wine 1.8稳定版及安装source insight
- Android平台环信IM开发实战案例
- python 线程池threadpool之实现
- [NOIP2013]货车运输,最大生成树+LCA
- 二维数组和字符串之间的互转
- 插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑
- LintCode_212 Space Replacement
- uva 11212 - Editing a Book
- LintCode_248 Count of Smaller Number
- LintCode_249 Count of Smaller Number before itself