Android端使用asmack实现IM

昨天简单介绍了一下 ejabberd 在Windows下的安装,然后PC端来使用 spark 连接 ejabberd,今天一捣鼓了一下asmack

在官网看到smack 4.1.0 已经支持Android了,不用再使用移植版的asmack了,不过现在是bate版 ,有兴趣的去看一下:https://www.igniterealtime.org/projects/smack/


第一步,引用 asmack-jse-buddycloud-2010.12.11.jar


下面一步一步来

1.连接服务器

                //三个参数分别为:主机IP,端口(一般都是5222),安装ejabberd时填写的的域名
                ConnectionConfiguration connectionConfig = new ConnectionConfiguration("192.168.1.100", 5222, "localhost");
                // 允许自动连接
                connectionConfig.setReconnectionAllowed(true);
                // 允许登陆成功后更新在线状态
                connectionConfig.setSendPresence(true);

                //下面为解决 找不到密钥凭证,4.0+系统不同
                Log.i("当前操作系统版本API Level=", Build.VERSION.SDK_INT + ""); //$NON-NLS-1$ //$NON-NLS-2$
                if (Build.VERSION.SDK_INT >= 14) {
                    connectionConfig.setTruststoreType("AndroidCAStore"); //$NON-NLS-1$
                    connectionConfig.setTruststorePassword(null);
                    connectionConfig.setTruststorePath(null);
                } else {
                    connectionConfig.setTruststoreType("BKS"); //$NON-NLS-1$
                    String path = System.getProperty("javax.net.ssl.trustStore"); //$NON-NLS-1$
                    if (path == null)
                        path = System.getProperty("java.home") + File.separator //$NON-NLS-1$
                                + "etc" + File.separator + "security" //$NON-NLS-1$ //$NON-NLS-2$
                                + File.separator + "cacerts.bks"; //$NON-NLS-1$
                    connectionConfig.setTruststorePath(path);
                }

                connectionConfig.setSecurityMode(SecurityMode.disabled);

                //获取到一个XMPPConnection对象
                connection = new XMPPConnection(connectionConfig);
                try {
                    connection.connect();// 开启连接
                } catch (XMPPException e) {
                    throw new IllegalStateException(e);
                }

获取账户管理类

 accountManager = connection.getAccountManager();// 获取账户管理类

注册用户
        try {
            accountManager.createAccount(username, password);
        } catch (XMPPException e) {
            e.printStackTrace();
        }

登录
 connection.login("用户名", "密码", "客户端标识");

创建一个聊天
注意上面监听消息的写法,smack 4.0.6的版本也是需要这样写,否则可能processMessage()不能被回调
            ChatManager chatmanager = connection.getChatManager();
            newChat = chatmanager.createChat(username + "@localhost", null);
            chatmanager.addChatListener(new ChatManagerListener() {
                @Override
                public void chatCreated(Chat arg0, boolean arg1) {
                    arg0.addMessageListener(new MessageListener() {
                        @Override
                        public void processMessage(Chat chat, Message message) {
                            Log.i("收到消息", message.getFrom() + ":" + message.getBody());
                        }
                    });
                }
            });

发送消息
 newChat.sendMessage(message);
修改状态
            //设置登陆后的个人状态信息
            Presence p = new Presence(Presence.Type.available);
            p.setStatus("吃饭...");
            connection.sendPacket(p);  
下线
connection.disconnect(); 
获取好友列表

        Collection<RosterEntry> rosters = connection.getRoster().getEntries();
        Log.i("zyh","-------我的好友列表-------");
        for(RosterEntry rosterEntry : rosters){
            Log.i("zyh","name: "+rosterEntry.getName()+",jid: "+rosterEntry.getUser());
        }