关闭

Android基于环信SDK开发IM即时聊天(一)

标签: androidIM即时通讯环信SDK聊天
14861人阅读 评论(13) 收藏 举报
分类:

2016-09-02更新:可以看一下最新的这篇文章和源码,Android基于环信SDK开发IM即时聊天(二)

目前市面上我了解的做第三方即时聊天SDK的有两家:环信融云,这里我使用环信SDK来完成即时聊天的初步开发工作。

下面先奉上1张效果图:
聊天内容列表

1、开发准备

首先要到环信官网注册开发者账号,目前只有企业账号注册,不过反正也不会去审核企业信息的正确与否,所以随便填写个自己喜欢的ID就好了。注册成功后,登陆到环信管理后台,新建一个应用,环信的appkey就是根据你的应用名和企业ID来确定的,比如我的企业ID叫SIP,应用名叫Luffy,那么我的appkey就是SIP#Luffy,简单好记。
然后需要在IDE(这里我还是使用的Eclipse)中新建一个Android Project,取名叫IMSample,该项目工程代码目前托管在CSDN平台下,传送门
最后在环信SDK官网下载最新的SDK,这样准备工作就完成了。

2、登陆注册

1、初始化SDK

把下载的SDK中的jar包和so文件放在对应目录下,在AndroidManifest.xml中添加appkey声明,然后是在代码中初始化SDK,建议继承Application类,在自己的application中初始化SDK

        int pid = android.os.Process.myPid();
        String processAppName = getAppName(pid);
        if (processAppName == null
                || !processAppName.equalsIgnoreCase("com.example.imsample")) {
            Log.e(TAG, "enter the service process!");
            return;
        }
        EMChat.getInstance().init(getApplicationContext());

2、注册

注册模式,我选择开放注册,然后在注册界面添加图片验证码功能,降低恶意注册垃圾用户的可能性。

        EMChatManager.getInstance().createAccountOnServer(userName, password);

注册流程
注册成功后,我们可以在环信管理后台中看到刚刚注册的用户,当然我们也可以在后台手动界面化添加注册用户
后台注册用户

3、登陆

登陆
然后回到登陆界面,使用刚刚注册的账号登陆

        EMChatManager.getInstance().login(userName, password, new EMCallBack() {// 回调
                    @Override
                    public void onSuccess() {
                        runOnUiThread(new Runnable() {
                            public void run() {
                                EMGroupManager.getInstance().loadAllGroups();
                                EMChatManager.getInstance()
                                        .loadAllConversations();
                                Toast.makeText(getApplicationContext(), "登陆成功",
                                        Toast.LENGTH_SHORT).show();
                                startActivity(new Intent(
                                        ChatLoginActivity.this,
                                        ManiActivity.class));
                            }
                        });
                    }

                    @Override
                    public void onProgress(int progress, String status) {

                    }

                    @Override
                    public void onError(int code, String message) {
                        if (code == -1005) {
                            message = "用户名或密码错误";
                        }
                        final String msg = message;
                        runOnUiThread(new Runnable() {
                            public void run() {
                                Toast.makeText(getApplicationContext(), msg,
                                        Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                });

如果下次再进入应用,默认是自动登陆的,当然也可以在application中设置不自动登陆

        EMChat.getInstance().setAutoLogin(false)

不过我们需要在自动登录的地方加入以下代码,不然会获取不到好友列表和会话信息等

        if (EMChat.getInstance().isLoggedIn()) {
            Log.d("TAG", "已经登陆过");
            EMGroupManager.getInstance().loadAllGroups();
            EMChatManager.getInstance().loadAllConversations();
            startActivity(new Intent(ChatLoginActivity.this,
                    ManiActivity.class));
        }

4、注销

注销当前登陆用户前,记得清空保存的用户数据

EMChatManager.getInstance().logout(new EMCallBack() {

            @Override
            public void onSuccess() {
                // 跳转到登陆页面
            }

            @Override
            public void onError(int code, String message) {
                // 登出失败

            }

            @Override
            public void onProgress(int progress, String status) {
                // 正在退出

            }

        });

3、好友管理

1、好友的添加

根据环信SDK官方开发文档介绍,需要对添加好友作异步处理
这里写图片描述

        try {
            EMContactManager.getInstance().addContact(idStr, reasonStr);
            Log.i("TAG", "请求发送成功,等待对方验证");
        } catch (EaseMobException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.i("TAG", "addContact-Errcode==>" + e.getErrorCode());
        }

2、好友申请的同意与拒绝

设置一个好友监听器来监听应用程序中好友的状态,同时告诉EMChat已经初始化完毕,可以开始监听了
这里写图片描述

        EMContactManager.getInstance().setContactListener(
                new MyContactListener());
        EMChat.getInstance().setAppInited();

继承EMContactListener实现的自定义好友监听器监听了五种不同的好友状态变化

    private class MyContactListener implements EMContactListener {

        @Override
        public void onContactAgreed(String username) {
            // 好友请求被同意
            Log.i("TAG", "onContactAgreed==>" + username);
            // 提示有新消息
            EMNotifier.getInstance(getApplicationContext()).notifyOnNewMsg();
            Toast.makeText(getApplicationContext(), username + "同意了你的好友请求",
                    Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onContactRefused(String username) {
            // 好友请求被拒绝
            Log.i("TAG", "onContactRefused==>" + username);
        }

        @Override
        public void onContactInvited(String username, String reason) {
            // 收到好友添加请求
            Log.i("TAG", username + "onContactInvited==>" + reason);
            showAgreedDialog(username, reason);
            EMNotifier.getInstance(getApplicationContext()).notifyOnNewMsg();
        }

        @Override
        public void onContactDeleted(List<String> usernameList) {
            // 好友被删除时回调此方法
            Log.i("TAG", "usernameListDeleted==>" + usernameList.size());
        }

        @Override
        public void onContactAdded(List<String> usernameList) {
            // 添加了新的好友时回调此方法
            for (String str : usernameList) {
                Log.i("TAG", "usernameListAdded==>" + str);
            }
        }
    }

对于好友申请的同意或者拒绝只需要一行代码,和上面第二步的好友添加一样,需要添加异步处理,之后记得刷新当前好友列表

EMChatManager.getInstance().acceptInvitation(user); // 同意
EMChatManager.getInstance().refuseInvitation(user); // 拒绝 

3、好友列表的获取

获取好友列表只能获取到好友的名字(id),如果想获取到每个好友的详细信息,还得再重新调取其他接口,在我的demo里,也不用获取到好友详细信息
这里写图片描述

List<String> userList = EMContactManager.getInstance().getContactUserNames();

4、好友的删除

长按好友列表某一项可以删除好友,删除好友和前面几步的添加、同意、拒绝一样,需要异步处理和刷新列表

EMChatManager.getInstance().deleteContact(user); // 删除

4、即时聊天

点击好友列表即可发起聊天请求,效果图见文章开头,四步走
第一:新建一个继承自BroadcastReceiver的用来接收新消息的广播

    private class NewMessageBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // 注销广播
            abortBroadcast();

            // 消息id(每条消息都会生成唯一的一个id,目前是SDK生成)
            String msgId = intent.getStringExtra("msgid");
            // 发送方
            String username = intent.getStringExtra("from");
            // 收到这个广播的时候,message已经在db和内存里了,可以通过id获取mesage对象
            EMMessage message = EMChatManager.getInstance().getMessage(msgId);
            EMConversation conversation = EMChatManager.getInstance()
                    .getConversation(username);

            MessageBody tmBody = message.getBody();

            ChatListData data = new ChatListData();
            data.setReceiveContent(((TextMessageBody) tmBody).getMessage());
            data.setType(2);
            mListData.add(data);
            mHandler.sendEmptyMessage(0x00001);

            Log.i("TAG", "收到消息:" + ((TextMessageBody) tmBody).getMessage());
            // 如果是群聊消息,获取到group id
            if (message.getChatType() == ChatType.GroupChat) {
                username = message.getTo();
            }

            if (!username.equals(username)) {
                // 消息不是发给当前会话,return
                return;
            }
        }
    }

第二:在该类入口处注册这个广播以及环信的intentFilter

        msgReceiver = new NewMessageBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter(EMChatManager
                .getInstance().getNewMessageBroadcastAction());
        intentFilter.setPriority(3);
        registerReceiver(msgReceiver, intentFilter);

第三:在发送消息按钮的监听方法里发送聊天消息

    void sendMessageHX(String username, final String content) {
        // 获取到与聊天人的会话对象。参数username为聊天人的userid或者groupid,后文中的username皆是如此
        EMConversation conversation = EMChatManager.getInstance()
                .getConversation(username);
        // 创建一条文本消息
        EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);
        // // 如果是群聊,设置chattype,默认是单聊
        // message.setChatType(ChatType.GroupChat);
        // 设置消息body
        TextMessageBody txtBody = new TextMessageBody(content);
        message.addBody(txtBody);
        // 设置接收人
        message.setReceipt(username);
        // 把消息加入到此会话对象中
        conversation.addMessage(message);
        // 发送消息
        EMChatManager.getInstance().sendMessage(message, new EMCallBack() {

            @Override
            public void onError(int arg0, String arg1) {
                // TODO Auto-generated method stub
                Log.i("TAG", "消息发送失败");
            }

            @Override
            public void onProgress(int arg0, String arg1) {
                // TODO Auto-generated method stub
                Log.i("TAG", "正在发送消息");
            }

            @Override
            public void onSuccess() {
                // TODO Auto-generated method stub
                Log.i("TAG", "消息发送成功");
                ChatListData data = new ChatListData();
                data.setSendContent(content);
                data.setType(1);
                mListData.add(data);
                mHandler.sendEmptyMessage(0x00001);
            }
        });
    }

第四:在该类的onDestory()方法里注销这个广播

@Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        unregisterReceiver(msgReceiver);

    }

5、总结

感觉环信SDK还是不太稳定,或者也有可能说是我没用好,这里这是简单的介绍下它的功能,在我的demo里仅仅简单实现了这样几个功能:
1,开放注册,登陆
2,好友添加、同意与拒绝(重新登陆才能看到)、删除,列表获取
3,只有双方都在聊天会话界面才能即时聊天
还有几个大问题没解决或者说需要重度优化:
1,断线重连
2,离线消息的保存与读取
3,好友添加请求与响应请求的即时显示
4,好友列表消息数目的获取显示
5,会话列表中消息的滚动位置及未读消息提示等

7
0
查看评论

Android使用socket.io实现即时通讯

简介WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯。而Socket.IO是一个完全由JavaScript实现、基于Node.js、支持WebSocket的协议用于实时通信、跨平台的开源框架。本文将根据 socket.io 官方提供的 socket.io-andr...
  • l_lhc
  • l_lhc
  • 2017-04-02 02:03
  • 9144

Android应用socket即时通讯的实现

一、服务器 思路: 首先创建服务器,用一个死循环等候若干个客户端的连接。一旦有客户端连接,就把客户端添加到集合当中,并且启动一个新的线程来保持长连接,监控客户端发来的信息。一旦接收到有客户端发来的信息,就进行包装后遍历集合,把包装好的信息发送给每一个客户端。 代码如下: /** * Tcp...
  • xxkalychen
  • xxkalychen
  • 2016-12-21 15:51
  • 5130

Android-IM从零开始开发一个即时通讯项目

关于聊天室项目聊天室项目,也被称为即时通讯(IM)。其原理是服务器是一直在启动状态的线程,不断的从客户端(App)获取消息,收到消息后,进行类型和发送目标判断,以发送到群组或者单聊的方式,客户端收到消息后进行界面的展示。如果要自己开发即时通讯类的 App,那么必须得要后台,但是现在很多第三方工具已经...
  • wapchief
  • wapchief
  • 2017-08-30 13:42
  • 1409

Android即时通讯实现原理

即时通讯实现原理即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议。前者是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路,进行连续的、双向的、严格保证数据正确...
  • qq_15807167
  • qq_15807167
  • 2016-07-19 20:58
  • 9353

Android中开发IM即时通讯功能的方案

最近准备做IM功能,在技术预研当中,其实可行方案还是比较多的,就看怎么选了 1.第三方平台 比如环信,融云,leancloud,容联云等等。直接使用sdk就可以实现了,最简单最直接,而且稳定性已经不错了,连UI界面都带有了,可以自行修改,缺点是要收费,比如环信日活跃30万以上开始收费,融云VIP级别...
  • PK0071
  • PK0071
  • 2016-08-03 17:37
  • 7022

Android基于环信开发的即时通讯APP

Android基于环信开发的即时通讯APP,源代码在Github上,GitHub地址为:https://github.com/PowerDos/BLChat
  • A5435431941
  • A5435431941
  • 2017-06-27 11:32
  • 653

Android即时通讯和sns开源项目汇总

本博客转载自: Android即时通讯和sns开源项目汇总 一 国内即时通讯和社交系统平台 排名不分先后! 1 LeanCloud 2 环信 3 网易云信 4 阿里百川 云旺OpenIM 5 腾讯云 6 融云 7 Bomb IM 8 OpenSNS ...
  • qq_27397109
  • qq_27397109
  • 2016-10-05 21:57
  • 1567

【Android即时通讯】Android 高仿微信的即时聊天DEMO

很久没写博客,在此写一篇高仿微信的即时聊天的DEMO,大家一起学习下。 这里微信界面仿照的是微信5.2版本,个人偏爱这版,并且网上也有较多的高仿界面可以学习,本人以极光IM做辅助,实现了即时聊天。 关于极光IM以及极光推送,大家可以去官网了解一下:http://docs.jpush.io/reso...
  • u011669081
  • u011669081
  • 2015-11-27 12:05
  • 7822

Android即时通讯--仿QQ即时聊天源码(含服务器)

  • 2016-02-27 16:12
  • 3.83MB
  • 下载

Android-IM即时通讯:环信

参考:基于环信即时通信云V2 SDK开发的聊天demo Android基于环信SDK开发IM即时聊天(一) android-使用环信SDK开发即时通信功能及源码下载IM :即时通信系统(IM,Instant Messenger)。Android第三方即时聊天SDK的有:网易云信、环信和融云等...
  • sinat_31057219
  • sinat_31057219
  • 2017-06-09 20:41
  • 1028
    个人资料
    • 访问:176625次
    • 积分:2793
    • 等级:
    • 排名:第15150名
    • 原创:58篇
    • 转载:5篇
    • 译文:0篇
    • 评论:52条
    联系我吧
    我的App
    博客专栏
    文章分类