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包:
  1. 一个是libs下带实时语音功能和实时视频功能的jar包和三个.so文件(jar包大小约为1.34M,三个.so文件文件约为4.76M) 
  2. 如果你不需要实时语音功能,实时视频功能,那就直接用libs.without.audio文件夹下的jar包(jar包大小约为900多K.)
到此您已经下载好了SDK,下面开始学习SDK的集成使用吧! 

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文件(里面包含了语音和视频通话功能)
  • 配置信息
在清单文件AndroidManifest.xml里加入以下权限,以及写上你注册的appkey 权限配置: 


复制代码
<?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