02_环信集成 app 即时通讯功能基础

初始化 SDK

在应用的 Application 的 onCreate() 方法中做初始化操作,同时我们可以传入一些设置好的 options。

 @Override
 public void onCreate() {
    EMOptions options = initChatOptions();
    //初始化
    if(options == null){
            EMClient.getInstance().init(this, initChatOptions());
    } else{
            EMClient.getInstance().init(this, options);
    }
    //在做打包混淆时,关闭debug模式,避免消耗不必要的资源
    EMClient.getInstance().setDebugMode(true);
 }


  private EMOptions initChatOptions(){
    EMOptions options = new EMOptions();
    // 默认添加好友时,是不需要验证的,改成需要验证
    options.setAcceptInvitationAlways(false);
    // set if you need read ack
    options.setRequireAck(true);
    // set if you need delivery ack
    options.setRequireDeliveryAck(false);
    // 建议初始化SDK的时候设置成每个会话默认load一条消息,节省加载会话的时间
    options.setNumberOfMessagesLoaded(1);

    //you need apply & set your own id if you want to use google cloud messaging.
    options.setGCMNumber("324169311137");
    //you need apply & set your own id if you want to use Mi push notification
    options.setMipushConfig("2882303761517426801", "5381742660801");
}

需要注意的是,如果应用中有其它第三方的服务启动,那么在初始化环信 SDK 之前需要添加下面相关的代码来防止环信 SDK 被初始化 2 次

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(appContext.getPackageName())) {
    Log.e(TAG, "enter the service process!");
    // 则此application::onCreate 是被service 调用的,直接返回
    return;
}
...
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;
}

注册

注册模式分两种,开放注册(客户端可以直接注册)和授权注册。

  • 开放注册是为了测试使用,正式环境中不推荐使用该方式注册环信账号;
  • 授权注册的流程是客户端填写好注册信息后点击注册按钮,注册信息提交到应用服务器,应用服务器提供环信提供的 REST API 进行注册,注册完成后应用服务器进行处理在返回给客户端注册结果。

登录

调用异步方法 login() 完成登录。需要注意的是在登录成功后需要调用 EMClient.getInstance().chatManager().loadAllConversations();EMClient.getInstance().groupManager().loadAllGroups();这两个方法是为了保证进入主页后本地会话和群组都 load 完毕

EMClient.getInstance().login(userName,password,new EMCallBack() {//回调
    @Override
    public void onSuccess() {
        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", "登录聊天服务器失败!");
    }
});

另外如果登录过,我们需要在应用的欢迎界面中还要加入上面两个方法来保证进入主页后本地会话和群组都 load 完毕。

在 SplashActivity 类中

if(isLoggedIn()) {
  EMClient.getInstance().chatManager().loadAllConversations();
  EMClient.getInstance().groupManager().loadAllGroups();
  ...
  startActivity(new Intent(SplashActivity.this, MainActivity.class));
}

public boolean isLoggedIn() {
  return EMClient.getInstance().isLoggedInBefore();
}

在我们首次登录成功后,不需要再次调用登录方法。在下次应用启动时,环信 SDK 会自动完成登录。如果自动登录失败,也会读取之前的会话信息。

自动登录在下面几种情况下会被取消:

  • 用户调用了 SDK 的登出动作;
  • 用户在别的设备上更改了密码,导致此设备上自动登录失败;
  • 用户的账号被从服务器端删除;
  • 用户从另一个设备登录,把当前设备上登录的用户踢出。

退出登录

// 异步方法
EMClient.getInstance().logout(true, 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
        
    }
});

有时候在执行退出登录时,由于网络问题而导致账号解绑失败,即使界面退出,但还会收到消息的现象。为了避免这种情况的发生,我们可以在应用选择退出时弹出对话框显示当前网络是否正常以及提示退出的风险(继续退出可能还会收到消息)。

需要注意的是,如果调用异步退出方法,在收到 onSuccess() 的回调后才去调用 IM 相关的方法,比如 login。

注册连接监听

当掉线时,Android SDK 会自动重连,无需进行任何操作,通过注册连接监听来知道连接状态。根据 onDisconnected() 方法返回的 error 判断账号连接失败的原因。

//注册一个监听连接状态的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
                    //当前网络不可用,请检查网络设置
                }
            }
        });
    }
}

文章只是作为自己记录学习使用,如果有使用不当的地方可以@我,谢谢。

参考文章:环信开发文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容