openfire + asmack

来源:互联网 发布:cf永久刷枪软件 编辑:程序博客网 时间:2024/05/17 23:29
/**
 * XmppConnection 工具类
 * @author 肖赛SoAi
 *
 */ 
public class XmppConnection { 
    privateint SERVER_PORT = 5222
    privateString SERVER_HOST = "127.0.0.1"
    privateXMPPConnection connection = null
    privateString SERVER_NAME = "ubuntuserver4java"
    privatestatic XmppConnection xmppConnection =new XmppConnection(); 
    privateTaxiConnectionListener connectionListener; 
    /**
     * 单例模式
     
     * @return
     */ 
    synchronizedpublic staticXmppConnection getInstance() { 
        returnxmppConnection; 
    
   
    /**
     * 创建连接
     */ 
    publicXMPPConnection getConnection() { 
        if(connection == null) { 
            openConnection(); 
        
        returnconnection; 
    
   
    /**
     * 打开连接
     */ 
    publicboolean openConnection() { 
        try
            if(null == connection || !connection.isAuthenticated()) { 
                XMPPConnection.DEBUG_ENABLED =true;// 开启DEBUG模式 
                // 配置连接 
                ConnectionConfiguration config =new ConnectionConfiguration( 
                        SERVER_HOST, SERVER_PORT, SERVER_NAME); 
                config.setReconnectionAllowed(true); 
                config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); 
                config.setSendPresence(true);// 状态设为离线,目的为了取离线消息 
                config.setSASLAuthenticationEnabled(false);// 是否启用安全验证 
                config.setTruststorePath("/system/etc/security/cacerts.bks"); 
                config.setTruststorePassword("changeit"); 
                config.setTruststoreType("bks"); 
                connection =new XMPPConnection(config); 
                connection.connect();// 连接到服务器 
                // 配置各种Provider,如果不配置,则会无法解析数据 
                configureConnection(ProviderManager.getInstance()); 
                returntrue
            
        }catch (XMPPException xe) { 
            xe.printStackTrace(); 
            connection =null
        
        returnfalse
    
   
    /**
     * 关闭连接
     */ 
    publicvoid closeConnection() { 
        if(connection!=null){ 
            //移除連接監聽 
            //connection.removeConnectionListener(connectionListener); 
            if(connection.isConnected()) 
                connection.disconnect(); 
            connection =null
        
        Log.i("XmppConnection","關閉連接"); 
    
   
    /**
     * 登录
     
     * @param account
     *            登录帐号
     * @param password
     *            登录密码
     * @return
     */ 
    publicboolean login(String account, String password) { 
        try
            if(getConnection() == null
                returnfalse
            getConnection().login(account, password); 
            // 更改在綫狀態 
            Presence presence =new Presence(Presence.Type.available); 
            getConnection().sendPacket(presence); 
            // 添加連接監聽 
            connectionListener =new TaxiConnectionListener(); 
            getConnection().addConnectionListener(connectionListener); 
            returntrue
        }catch (XMPPException xe) { 
            xe.printStackTrace(); 
        
        returnfalse
    
   
    /**
     * 注册
     
     * @param account
     *            注册帐号
     * @param password
     *            注册密码
     * @return 1、注册成功 0、服务器没有返回结果2、这个账号已经存在3、注册失败
     */ 
    publicString regist(String account, String password) { 
        if(getConnection() == null
            return"0"
        Registration reg =new Registration(); 
        reg.setType(IQ.Type.SET); 
        reg.setTo(getConnection().getServiceName()); 
        // 注意这里createAccount注册时,参数是UserName,不是jid,是"@"前面的部分。 
        reg.setUsername(account); 
        reg.setPassword(password); 
        // 这边addAttribute不能为空,否则出错。所以做个标志是android手机创建的吧!!!!! 
        reg.addAttribute("android","geolo_createUser_android"); 
        PacketFilter filter =new AndFilter(newPacketIDFilter( 
                reg.getPacketID()),new PacketTypeFilter(IQ.class)); 
        PacketCollector collector = getConnection().createPacketCollector( 
                filter); 
        getConnection().sendPacket(reg); 
        IQ result = (IQ) collector.nextResult(SmackConfiguration 
                .getPacketReplyTimeout()); 
        // Stop queuing results停止请求results(是否成功的结果) 
        collector.cancel(); 
        if(result == null) { 
            Log.e("regist","No response from server."); 
            return"0"
        }else if(result.getType() == IQ.Type.RESULT) { 
            Log.v("regist","regist success."); 
            return"1"
        }else { // if (result.getType() == IQ.Type.ERROR) 
            if(result.getError().toString().equalsIgnoreCase("conflict(409)")) { 
                Log.e("regist","IQ.Type.ERROR: " 
                        + result.getError().toString()); 
                return"2"
            }else
                Log.e("regist","IQ.Type.ERROR: " 
                        + result.getError().toString()); 
                return"3"
            
        
    
   
    /**
     * 更改用户状态
     */ 
    publicvoid setPresence(intcode) { 
        XMPPConnection con = getConnection(); 
        if(con == null
            return
        Presence presence; 
        switch(code) { 
        case0
            presence =new Presence(Presence.Type.available); 
            con.sendPacket(presence); 
            Log.v("state","设置在线"); 
            break
        case1
            presence =new Presence(Presence.Type.available); 
            presence.setMode(Presence.Mode.chat); 
            con.sendPacket(presence); 
            Log.v("state","设置Q我吧"); 
            break
        case2
            presence =new Presence(Presence.Type.available); 
            presence.setMode(Presence.Mode.dnd); 
            con.sendPacket(presence); 
            Log.v("state","设置忙碌"); 
            break
        case3
            presence =new Presence(Presence.Type.available); 
            presence.setMode(Presence.Mode.away); 
            con.sendPacket(presence); 
            Log.v("state","设置离开"); 
            break
        case4
            Roster roster = con.getRoster(); 
            Collection<RosterEntry> entries = roster.getEntries(); 
            for(RosterEntry entry : entries) { 
                presence =new Presence(Presence.Type.unavailable); 
                presence.setPacketID(Packet.ID_NOT_AVAILABLE); 
                presence.setFrom(con.getUser()); 
                presence.setTo(entry.getUser()); 
                con.sendPacket(presence); 
                Log.v("state", presence.toXML()); 
            
            // 向同一用户的其他客户端发送隐身状态 
            presence =new Presence(Presence.Type.unavailable); 
            presence.setPacketID(Packet.ID_NOT_AVAILABLE); 
            presence.setFrom(con.getUser()); 
            presence.setTo(StringUtils.parseBareAddress(con.getUser())); 
            con.sendPacket(presence); 
            Log.v("state","设置隐身"); 
            break
        case5
            presence =new Presence(Presence.Type.unavailable); 
            con.sendPacket(presence); 
            Log.v("state","设置离线"); 
            break
        default
            break
        
    
   
    /**
     * 获取所有组
     
     * @return 所有组集合
     */ 
    publicList<RosterGroup> getGroups() { 
        if(getConnection() == null
            returnnull
        List<RosterGroup> grouplist =new ArrayList<RosterGroup>(); 
        Collection<RosterGroup> rosterGroup = getConnection().getRoster() 
                .getGroups(); 
        Iterator<RosterGroup> i = rosterGroup.iterator(); 
        while(i.hasNext()) { 
            grouplist.add(i.next()); 
        
        returngrouplist; 
    
   
    /**
     * 获取某个组里面的所有好友
     
     * @param roster
     * @param groupName
     *            组名
     * @return
     */ 
    publicList<RosterEntry> getEntriesByGroup(String groupName) { 
        if(getConnection() == null
            returnnull
        List<RosterEntry> Entrieslist =new ArrayList<RosterEntry>(); 
        RosterGroup rosterGroup = getConnection().getRoster().getGroup( 
                groupName); 
        Collection<RosterEntry> rosterEntry = rosterGroup.getEntries(); 
        Iterator<RosterEntry> i = rosterEntry.iterator(); 
        while(i.hasNext()) { 
            Entrieslist.add(i.next()); 
        
        returnEntrieslist; 
    
   
    /**
     * 获取所有好友信息
     
     * @return
     */ 
    publicList<RosterEntry> getAllEntries() { 
        if(getConnection() == null
            returnnull
        List<RosterEntry> Entrieslist =new ArrayList<RosterEntry>(); 
        Collection<RosterEntry> rosterEntry = getConnection().getRoster() 
                .getEntries(); 
        Iterator<RosterEntry> i = rosterEntry.iterator(); 
        while(i.hasNext()) { 
            Entrieslist.add(i.next()); 
        
        returnEntrieslist; 
    
   
    /**
     * 获取用户VCard信息
     
     * @param connection
     * @param user
     * @return
     * @throws XMPPException
     */ 
    publicVCard getUserVCard(String user) { 
        if(getConnection() == null
            returnnull
        VCard vcard =new VCard(); 
        try
            vcard.load(getConnection(), user); 
        }catch (XMPPException e) { 
            e.printStackTrace(); 
        
        returnvcard; 
    
   
    /**
     * 获取用户头像信息
     
     * @param connection
     * @param user
     * @return
     */ 
    publicDrawable getUserImage(String user) { 
        if(getConnection() == null
            returnnull
        ByteArrayInputStream bais =null
        try
            VCard vcard =new VCard(); 
            // 加入这句代码,解决No VCard for 
            ProviderManager.getInstance().addIQProvider("vCard","vcard-temp"
                    neworg.jivesoftware.smackx.provider.VCardProvider()); 
            if(user == "" || user == null || user.trim().length() <= 0) { 
                returnnull
            
            vcard.load(getConnection(), user +"@" 
                    + getConnection().getServiceName()); 
   
            if(vcard == null || vcard.getAvatar() == null
                returnnull
            bais =new ByteArrayInputStream(vcard.getAvatar()); 
        }catch (Exception e) { 
            e.printStackTrace(); 
            returnnull
        
        returnFormatTools.getInstance().InputStream2Drawable(bais); 
    
   
    /**
     * 添加一个分组
     
     * @param groupName
     * @return
     */ 
    publicboolean addGroup(String groupName) { 
        if(getConnection() == null
            returnfalse
        try
            getConnection().getRoster().createGroup(groupName); 
            Log.v("addGroup", groupName +"創建成功"); 
            returntrue
        }catch (Exception e) { 
            e.printStackTrace(); 
            returnfalse
        
    
   
    /**
     * 删除分组
     
     * @param groupName
     * @return
     */ 
    publicboolean removeGroup(String groupName) { 
        returntrue
    
   
    /**
     * 添加好友 无分组
     
     * @param userName
     * @param name
     * @return
     */ 
    publicboolean addUser(String userName, String name) { 
        if(getConnection() == null
            returnfalse
        try
            getConnection().getRoster().createEntry(userName, name,null); 
            returntrue
        }catch (Exception e) { 
            e.printStackTrace(); 
            returnfalse
        
    
   
    /**
     * 添加好友 有分组
     
     * @param userName
     * @param name
     * @param groupName
     * @return
     */ 
    publicboolean addUser(String userName, String name, String groupName) { 
        if(getConnection() == null
            returnfalse
        try
            Presence subscription =new Presence(Presence.Type.subscribed); 
            subscription.setTo(userName); 
            userName +="@" + getConnection().getServiceName(); 
            getConnection().sendPacket(subscription); 
            getConnection().getRoster().createEntry(userName, name, 
                    newString[] { groupName }); 
            returntrue
        }catch (Exception e) { 
            e.printStackTrace(); 
            returnfalse
        
    
   
    /**
     * 删除好友
     
     * @param userName
     * @return
     */ 
    publicboolean removeUser(String userName) { 
        if(getConnection() == null
            returnfalse
        try
            RosterEntry entry =null
            if(userName.contains("@")) 
                entry = getConnection().getRoster().getEntry(userName); 
            else 
                entry = getConnection().getRoster().getEntry( 
                        userName +"@" + getConnection().getServiceName()); 
            if(entry == null
                entry = getConnection().getRoster().getEntry(userName); 
            getConnection().getRoster().removeEntry(entry); 
   
            returntrue
        }catch (Exception e) { 
            e.printStackTrace(); 
            returnfalse
        
    
   
    /**
     * 查询用户
     
     * @param userName
     * @return
     * @throws XMPPException
     */ 
    publicList<HashMap<String, String>> searchUsers(String userName) { 
        if(getConnection() == null
            returnnull
        HashMap<String, String> user =null
        List<HashMap<String, String>> results =new ArrayList<HashMap<String, String>>(); 
        try
            newServiceDiscoveryManager(getConnection()); 
   
            UserSearchManager usm =new UserSearchManager(getConnection()); 
   
            Form searchForm = usm.getSearchForm(getConnection() 
                    .getServiceName()); 
            Form answerForm = searchForm.createAnswerForm(); 
            answerForm.setAnswer("userAccount",true); 
            answerForm.setAnswer("userPhote", userName); 
            ReportedData data = usm.getSearchResults(answerForm,"search" 
                    + getConnection().getServiceName()); 
   
            Iterator<Row> it = data.getRows(); 
            Row row =null
            while(it.hasNext()) { 
                user =new HashMap<String, String>(); 
                row = it.next(); 
                user.put("userAccount", row.getValues("userAccount").next() 
                        .toString()); 
                user.put("userPhote", row.getValues("userPhote").next() 
                        .toString()); 
                results.add(user); 
                // 若存在,则有返回,UserName一定非空,其他两个若是有设,一定非空 
            
        }catch (XMPPException e) { 
            e.printStackTrace(); 
        
        returnresults; 
    
   
    /**
     * 修改心情
     
     * @param connection
     * @param status
     */ 
    publicvoid changeStateMessage(String status) { 
        if(getConnection() == null
            return
        Presence presence =new Presence(Presence.Type.available); 
        presence.setStatus(status); 
        getConnection().sendPacket(presence); 
    
   
    /**
     * 修改用户头像
     
     * @param file
     */ 
    publicboolean changeImage(File file) { 
        if(getConnection() == null
            returnfalse
        try
            VCard vcard =new VCard(); 
            vcard.load(getConnection()); 
   
            byte[] bytes; 
   
            bytes = getFileBytes(file); 
            String encodedImage = StringUtils.encodeBase64(bytes); 
            vcard.setAvatar(bytes, encodedImage); 
            vcard.setEncodedImage(encodedImage); 
            vcard.setField("PHOTO","<TYPE>image/jpg</TYPE><BINVAL>" 
                    + encodedImage +"</BINVAL>", true); 
   
            ByteArrayInputStream bais =new ByteArrayInputStream( 
                    vcard.getAvatar()); 
            FormatTools.getInstance().InputStream2Bitmap(bais); 
   
            vcard.save(getConnection()); 
            returntrue
        }catch (Exception e) { 
            e.printStackTrace(); 
            returnfalse
        
    
   
    /**
     * 文件转字节
     
     * @param file
     * @return
     * @throws IOException
     */ 
    privatebyte[] getFileBytes(File file)throws IOException { 
        BufferedInputStream bis =null
        try
            bis =new BufferedInputStream(newFileInputStream(file)); 
            intbytes = (int) file.length(); 
            byte[] buffer =new byte[bytes]; 
            intreadBytes = bis.read(buffer); 
            if(readBytes != buffer.length) { 
                thrownew IOException("Entire file not read"); 
            
            returnbuffer; 
        }finally
            if(bis != null) { 
                bis.close(); 
            
        
    
   
    /**
     * 删除当前用户
     
     * @return
     */ 
    publicboolean deleteAccount() { 
        if(getConnection() == null
            returnfalse
        try
            getConnection().getAccountManager().deleteAccount(); 
            returntrue
        }catch (XMPPException e) { 
            returnfalse
        
    
   
    /**
     * 修改密码
     
     * @return
     */ 
    publicboolean changePassword(String pwd) { 
        if(getConnection() == null
            returnfalse
        try
            getConnection().getAccountManager().changePassword(pwd); 
            returntrue
        }catch (XMPPException e) { 
            returnfalse
        
    
   
    /**
     * 初始化会议室列表
     */ 
    publicList<HostedRoom> getHostRooms() { 
        if(getConnection() == null
            returnnull
        Collection<HostedRoom> hostrooms =null
        List<HostedRoom> roominfos =new ArrayList<HostedRoom>(); 
        try
            newServiceDiscoveryManager(getConnection()); 
            hostrooms = MultiUserChat.getHostedRooms(getConnection(), 
                    getConnection().getServiceName()); 
            for(HostedRoom entry : hostrooms) { 
                roominfos.add(entry); 
                Log.i("room"
                        "名字:"+ entry.getName() + " - ID:"+ entry.getJid()); 
            
            Log.i("room","服务会议数量:" + roominfos.size()); 
        }catch (XMPPException e) { 
            e.printStackTrace(); 
        
        returnroominfos; 
    
   
    /**
     * 创建房间
     
     * @param roomName
     *            房间名称
     */ 
    publicMultiUserChat createRoom(String user, String roomName, 
            String password) { 
        if(getConnection() == null
            returnnull
   
        MultiUserChat muc =null
        try
            // 创建一个MultiUserChat 
            muc =new MultiUserChat(getConnection(), roomName +"@conference." 
                    + getConnection().getServiceName()); 
            // 创建聊天室 
            muc.create(roomName); 
            // 获得聊天室的配置表单 
            Form form = muc.getConfigurationForm(); 
            // 根据原始表单创建一个要提交的新表单。 
            Form submitForm = form.createAnswerForm(); 
            // 向要提交的表单添加默认答复 
            for(Iterator<FormField> fields = form.getFields(); fields 
                    .hasNext();) { 
                FormField field = (FormField) fields.next(); 
                if(!FormField.TYPE_HIDDEN.equals(field.getType()) 
                        && field.getVariable() !=null) { 
                    // 设置默认值作为答复 
                    submitForm.setDefaultAnswer(field.getVariable()); 
                
            
            // 设置聊天室的新拥有者 
            List<String> owners =new ArrayList<String>(); 
            owners.add(getConnection().getUser());// 用户JID 
            submitForm.setAnswer("muc#roomconfig_roomowners", owners); 
            // 设置聊天室是持久聊天室,即将要被保存下来 
            submitForm.setAnswer("muc#roomconfig_persistentroom",true); 
            // 房间仅对成员开放 
            submitForm.setAnswer("muc#roomconfig_membersonly",false); 
            // 允许占有者邀请其他人 
            submitForm.setAnswer("muc#roomconfig_allowinvites",true); 
            if(!password.equals("")) { 
                // 进入是否需要密码 
                submitForm.setAnswer("muc#roomconfig_passwordprotectedroom"
                        true); 
                // 设置进入密码 
                submitForm.setAnswer("muc#roomconfig_roomsecret", password); 
            
            // 能够发现占有者真实 JID 的角色 
            // submitForm.setAnswer("muc#roomconfig_whois", "anyone"); 
            // 登录房间对话 
            submitForm.setAnswer("muc#roomconfig_enablelogging",true); 
            // 仅允许注册的昵称登录 
            submitForm.setAnswer("x-muc#roomconfig_reservednick",true); 
            // 允许使用者修改昵称 
            submitForm.setAnswer("x-muc#roomconfig_canchangenick",false); 
            // 允许用户注册房间 
            submitForm.setAnswer("x-muc#roomconfig_registration",false); 
            // 发送已完成的表单(有默认值)到服务器来配置聊天室 
            muc.sendConfigurationForm(submitForm); 
        }catch (XMPPException e) { 
            e.printStackTrace(); 
            returnnull
        
        returnmuc; 
    
   
    /**
     * 加入会议室
     
     * @param user
     *            昵称
     * @param password
     *            会议室密码
     * @param roomsName
     *            会议室名
     */ 
    publicMultiUserChat joinMultiUserChat(String user, String roomsName, 
            String password) { 
        if(getConnection() == null
            returnnull
        try
            // 使用XMPPConnection创建一个MultiUserChat窗口 
            MultiUserChat muc =new MultiUserChat(getConnection(), roomsName 
                    +"@conference." + getConnection().getServiceName()); 
            // 聊天室服务将会决定要接受的历史记录数量 
            DiscussionHistory history =new DiscussionHistory(); 
            history.setMaxChars(0); 
            // history.setSince(new Date()); 
            // 用户加入聊天室 
            muc.join(user, password, history, 
                    SmackConfiguration.getPacketReplyTimeout()); 
            Log.i("MultiUserChat","会议室【"+roomsName+"】加入成功........"); 
            returnmuc; 
        }catch (XMPPException e) { 
            e.printStackTrace(); 
            Log.i("MultiUserChat","会议室【"+roomsName+"】加入失败........"); 
            returnnull
        
    
   
    /**
     * 查询会议室成员名字
     
     * @param muc
     */ 
    publicList<String> findMulitUser(MultiUserChat muc) { 
        if(getConnection() == null
            returnnull
        List<String> listUser =new ArrayList<String>(); 
        Iterator<String> it = muc.getOccupants(); 
        // 遍历出聊天室人员名称 
        while(it.hasNext()) { 
            // 聊天室成员名字 
            String name = StringUtils.parseResource(it.next()); 
            listUser.add(name); 
        
        returnlistUser; 
    
   
    /**
     * 发送文件
     
     * @param user
     * @param filePath
     */ 
    publicvoid sendFile(String user, String filePath) { 
        if(getConnection() == null
            return
        // 创建文件传输管理器 
        FileTransferManager manager =new FileTransferManager(getConnection()); 
   
        // 创建输出的文件传输 
        OutgoingFileTransfer transfer = manager 
                .createOutgoingFileTransfer(user); 
   
        // 发送文件 
        try
            transfer.sendFile(newFile(filePath), "You won't believe this!"); 
        }catch (XMPPException e) { 
            e.printStackTrace(); 
        
    
   
    /**
     * 获取离线消息
     
     * @return
     */ 
    publicMap<String, List<HashMap<String, String>>> getHisMessage() { 
        if(getConnection() == null
            returnnull
        Map<String, List<HashMap<String, String>>> offlineMsgs =null
   
        try
            OfflineMessageManager offlineManager =new OfflineMessageManager( 
                    getConnection()); 
            Iterator<Message> it = offlineManager.getMessages(); 
   
            intcount = offlineManager.getMessageCount(); 
            if(count <= 0
                returnnull
            offlineMsgs =new HashMap<String, List<HashMap<String, String>>>(); 
   
            while(it.hasNext()) { 
                Message message = it.next(); 
                String fromUser = StringUtils.parseName(message.getFrom()); 
                
                HashMap<String, String> histrory =new HashMap<String, String>(); 
                histrory.put("useraccount"
                        StringUtils.parseName(getConnection().getUser())); 
                histrory.put("friendaccount", fromUser); 
                histrory.put("info", message.getBody()); 
                histrory.put("type","left"); 
                if(offlineMsgs.containsKey(fromUser)) { 
                    offlineMsgs.get(fromUser).add(histrory); 
                }else
                    List<HashMap<String, String>> temp =new ArrayList<HashMap<String, String>>(); 
                    temp.add(histrory); 
                    offlineMsgs.put(fromUser, temp); 
                
            
            offlineManager.deleteMessages(); 
        }catch (Exception e) { 
            e.printStackTrace(); 
        
        returnofflineMsgs; 
    
       
    /**
     * 判断OpenFire用户的状态 strUrl : 
     * url格式 -http://my.openfire.com:9090/plugins/presence
     * /status?jid=user1@SERVER_NAME&type=xml 
     * 返回值 : 0 - 用户不存在; 1 - 用户在线; 2 - 用户离线 
     * 说明 :必须要求 OpenFire加载 presence 插件,同时设置任何人都可以访问
     */    
    publicint IsUserOnLine(String user) { 
        String url ="http://"+SERVER_HOST+":9090/plugins/presence/status?"
                "jid="+ user +"@"+ SERVER_NAME +"&type=xml"
        intshOnLineState = 0;// 不存在 
        try
            URL oUrl =new URL(url); 
            URLConnection oConn = oUrl.openConnection(); 
            if(oConn != null) { 
                BufferedReader oIn =new BufferedReader(newInputStreamReader( 
                        oConn.getInputStream())); 
                if(null != oIn) { 
                    String strFlag = oIn.readLine(); 
                    oIn.close(); 
                    System.out.println("strFlag"+strFlag); 
                    if(strFlag.indexOf("type=\"unavailable\"") >=0) { 
                        shOnLineState =2
                    
                    if(strFlag.indexOf("type=\"error\"") >=0) { 
                        shOnLineState =0
                    }else if(strFlag.indexOf("priority") >=0 
                            || strFlag.indexOf("id=\"") >=0) { 
                        shOnLineState =1
                    
                
            
        }catch (Exception e) { 
            e.printStackTrace(); 
        
   
        returnshOnLineState; 
    
   
    /**
     * 加入providers的函数 ASmack在/META-INF缺少一个smack.providers 文件
     
     * @param pm
     */ 
    publicvoid configureConnection(ProviderManager pm) { 
   
        // Private Data Storage 
        pm.addIQProvider("query","jabber:iq:private"
                newPrivateDataManager.PrivateDataIQProvider()); 
   
        // Time 
        try
            pm.addIQProvider("query","jabber:iq:time"
                    Class.forName("org.jivesoftware.smackx.packet.Time")); 
        }catch (ClassNotFoundException e) { 
            Log.w("TestClient"
                    "Can't load class for org.jivesoftware.smackx.packet.Time"); 
        
   
        // Roster Exchange 
        pm.addExtensionProvider("x","jabber:x:roster"
                newRosterExchangeProvider()); 
   
        // Message Events 
        pm.addExtensionProvider("x","jabber:x:event"
                newMessageEventProvider()); 
   
        // Chat State 
        pm.addExtensionProvider("active"
                "http://jabber.org/protocol/chatstates"
                newChatStateExtension.Provider()); 
        pm.addExtensionProvider("composing"
                "http://jabber.org/protocol/chatstates"
                newChatStateExtension.Provider()); 
        pm.addExtensionProvider("paused"
                "http://jabber.org/protocol/chatstates"
                newChatStateExtension.Provider()); 
        pm.addExtensionProvider("inactive"
                "http://jabber.org/protocol/chatstates"
                newChatStateExtension.Provider()); 
        pm.addExtensionProvider("gone"
                "http://jabber.org/protocol/chatstates"
                newChatStateExtension.Provider()); 
   
        // XHTML 
        pm.addExtensionProvider("html","http://jabber.org/protocol/xhtml-im"
                newXHTMLExtensionProvider()); 
   
        // Group Chat Invitations 
        pm.addExtensionProvider("x","jabber:x:conference"
                newGroupChatInvitation.Provider()); 
   
        // Service Discovery # Items 
        pm.addIQProvider("query","http://jabber.org/protocol/disco#items"
                newDiscoverItemsProvider()); 
   
        // Service Discovery # Info 
        pm.addIQProvider("query","http://jabber.org/protocol/disco#info"
                newDiscoverInfoProvider()); 
   
        // Data Forms 
        pm.addExtensionProvider("x","jabber:x:data",new DataFormProvider()); 
   
        // MUC User 
        pm.addExtensionProvider("x","http://jabber.org/protocol/muc#user"
                newMUCUserProvider()); 
   
        // MUC Admin 
        pm.addIQProvider("query","http://jabber.org/protocol/muc#admin"
                newMUCAdminProvider()); 
   
        // MUC Owner 
        pm.addIQProvider("query","http://jabber.org/protocol/muc#owner"
                newMUCOwnerProvider()); 
   
        // Delayed Delivery 
        pm.addExtensionProvider("x","jabber:x:delay"
                newDelayInformationProvider()); 
   
        // Version 
        try
            pm.addIQProvider("query","jabber:iq:version"
                    Class.forName("org.jivesoftware.smackx.packet.Version")); 
        }catch (ClassNotFoundException e) { 
            // Not sure what's happening here. 
        
   
        // VCard 
        pm.addIQProvider("vCard","vcard-temp", new VCardProvider()); 
   
        // Offline Message Requests 
        pm.addIQProvider("offline","http://jabber.org/protocol/offline"
                newOfflineMessageRequest.Provider()); 
   
        // Offline Message Indicator 
        pm.addExtensionProvider("offline"
                "http://jabber.org/protocol/offline"
                newOfflineMessageInfo.Provider()); 
   
        // Last Activity 
        pm.addIQProvider("query","jabber:iq:last",new LastActivity.Provider()); 
   
        // User Search 
        pm.addIQProvider("query","jabber:iq:search",new UserSearch.Provider()); 
   
        // SharedGroupsInfo 
        pm.addIQProvider("sharedgroup"
                "http://www.jivesoftware.org/protocol/sharedgroup"
                newSharedGroupsInfo.Provider()); 
   
        // JEP-33: Extended Stanza Addressing 
        pm.addExtensionProvider("addresses"
                "http://jabber.org/protocol/address"
                newMultipleAddressesProvider()); 
   
        // FileTransfer 
        pm.addIQProvider("si","http://jabber.org/protocol/si"
                newStreamInitiationProvider()); 
   
        pm.addIQProvider("query","http://jabber.org/protocol/bytestreams"
                newBytestreamsProvider()); 
   
        // Privacy 
        pm.addIQProvider("query","jabber:iq:privacy",new PrivacyProvider()); 
        pm.addIQProvider("command","http://jabber.org/protocol/commands"
                newAdHocCommandDataProvider()); 
        pm.addExtensionProvider("malformed-action"
                "http://jabber.org/protocol/commands"
                newAdHocCommandDataProvider.MalformedActionError()); 
        pm.addExtensionProvider("bad-locale"
                "http://jabber.org/protocol/commands"
                newAdHocCommandDataProvider.BadLocaleError()); 
        pm.addExtensionProvider("bad-payload"
                "http://jabber.org/protocol/commands"
                newAdHocCommandDataProvider.BadPayloadError()); 
        pm.addExtensionProvider("bad-sessionid"
                "http://jabber.org/protocol/commands"
                newAdHocCommandDataProvider.BadSessionIDError()); 
        pm.addExtensionProvider("session-expired"
                "http://jabber.org/protocol/commands"
                newAdHocCommandDataProvider.SessionExpiredError()); 
    
   
}



---------------------------------------------------------------------


/**
 * 所有的数据控制,逻辑可以在这里实现
 *
 */
public class DataUtils implementsConnectionListener,
        ConnectionCreationListener, PacketListener {
 
    privatestatic DataUtils instance;
    privateConnection connection;
    privatestatic String host;
    privatestatic int port;
    privateString user;
 
    privateDataUtils() {
    }
 
    publicvoid setHost(String host,int port) {
        DataUtils.host = host;
        DataUtils.port = port;
    }
 
    publicstatic DataUtils getInstance() {
        if(instance == null)
            instance =new DataUtils();
        returninstance;
    }
 
    publicConnection getConnection() {
        returnconnection;
    }
 
    publicString getUser() {
        returnuser;
    }
 
    publicvoid requestBaidu() {
        CachedThreadPool.execute(newRunnable() {
 
            @Override
            publicvoid run() {
                // TODO Auto-generated method stub
                HttpUtil httpUtil = HttpUtil.requestText(
                        "http://www.baidu.com","GET");
                HttpResult result = httpUtil.getResponse();
                if(result.getCode() == 200) {
                    // 向界面发送接收广播
                }
            }
        });
    }
 
    publicvoid initXMPP() {
        CachedThreadPool.execute(newRunnable() {
 
            @Override
            publicvoid run() {
                // TODO Auto-generated method stub
                connectXmppServer();
            }
        });
    }
 
    privatevoid connectXmppServer() {
        ConnectionConfiguration config =new ConnectionConfiguration(host, port);
        /** 是否启用安全验证 */
        config.setSASLAuthenticationEnabled(false);
        config.setReconnectionAllowed(true);// 断线重连
        /** 是否启用调试 */
        // config.setDebuggerEnabled(true);
        /** 创建connection链接 */
        try{
            Connection.addConnectionCreationListener(this);
            configure(ProviderManager.getInstance());
            connection =new XMPPConnection(config);
            /** 建立连接 */
            connection.connect();
            connection.addConnectionListener(this);
            PacketTypeFilter filter =new PacketTypeFilter(Packet.class);
            connection.addPacketListener(this, filter);
        }catch (XMPPException e) {
            e.printStackTrace();
            MLog.makeText("服务器连接失败");
        }
    }
 
    /**
     * Android读不到/META-INF下的配置文件,需要手工配置。
     *
     * @param pm
     */
    privatevoid configure(ProviderManager pm) {
        // Private Data Storage
        pm.addIQProvider("query","jabber:iq:private",
                newPrivateDataManager.PrivateDataIQProvider());
        // Time
        try{
            pm.addIQProvider("query","jabber:iq:time",
                    Class.forName("org.jivesoftware.smackx.packet.Time"));
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        // Roster Exchange
        pm.addExtensionProvider("x","jabber:x:roster",
                newRosterExchangeProvider());
        // Message Events
        pm.addExtensionProvider("x","jabber:x:event",
                newMessageEventProvider());
        // Chat State
        pm.addExtensionProvider("active",
                "http://jabber.org/protocol/chatstates",
                newChatStateExtension.Provider());
        pm.addExtensionProvider("composing",
                "http://jabber.org/protocol/chatstates",
                newChatStateExtension.Provider());
        pm.addExtensionProvider("paused",
                "http://jabber.org/protocol/chatstates",
                newChatStateExtension.Provider());
        pm.addExtensionProvider("inactive",
                "http://jabber.org/protocol/chatstates",
                newChatStateExtension.Provider());
        pm.addExtensionProvider("gone",
                "http://jabber.org/protocol/chatstates",
                newChatStateExtension.Provider());
        // XHTML
        pm.addExtensionProvider("html","http://jabber.org/protocol/xhtml-im",
                newXHTMLExtensionProvider());
        // Group Chat Invitations
        pm.addExtensionProvider("x","jabber:x:conference",
                newGroupChatInvitation.Provider());
        // Service Discovery # Items
        pm.addIQProvider("query","http://jabber.org/protocol/disco#items",
                newDiscoverItemsProvider());
        // Service Discovery # Info
        pm.addIQProvider("query","http://jabber.org/protocol/disco#info",
                newDiscoverInfoProvider());
        // Data Forms
        pm.addExtensionProvider("x","jabber:x:data",new DataFormProvider());
        // MUC User
        pm.addExtensionProvider("x","http://jabber.org/protocol/muc#user",
                newMUCUserProvider());
        // MUC Admin
        pm.addIQProvider("query","http://jabber.org/protocol/muc#admin",
                newMUCAdminProvider());
        // MUC Owner
        pm.addIQProvider("query","http://jabber.org/protocol/muc#owner",
                newMUCOwnerProvider());
        // Delayed Delivery
        pm.addExtensionProvider("x","jabber:x:delay",
                newDelayInformationProvider());
        // Version
        try{
            pm.addIQProvider("query","jabber:iq:version",
                    Class.forName("org.jivesoftware.smackx.packet.Version"));
        }catch (ClassNotFoundException e) {
            // Not sure what's happening here.
            e.printStackTrace();
        }
        // VCard
        pm.addIQProvider("vCard","vcard-temp", new VCardProvider());
        // Offline Message Requests
        pm.addIQProvider("offline","http://jabber.org/protocol/offline",
                newOfflineMessageRequest.Provider());
        // Offline Message Indicator
        pm.addExtensionProvider("offline",
                "http://jabber.org/protocol/offline",
                newOfflineMessageInfo.Provider());
        // Last Activity
        pm.addIQProvider("query","jabber:iq:last",new LastActivity.Provider());
        // User Search
        pm.addIQProvider("query","jabber:iq:search",new UserSearch.Provider());
        // SharedGroupsInfo
        pm.addIQProvider("sharedgroup",
                "http://www.jivesoftware.org/protocol/sharedgroup",
                newSharedGroupsInfo.Provider());
        // JEP-33: Extended Stanza Addressing
        pm.addExtensionProvider("addresses",
                "http://jabber.org/protocol/address",
                newMultipleAddressesProvider());
        // FileTransfer
        pm.addIQProvider("si","http://jabber.org/protocol/si",
                newStreamInitiationProvider());
        pm.addIQProvider("query","http://jabber.org/protocol/bytestreams",
                newBytestreamsProvider());
        // Privacy
        pm.addIQProvider("query","jabber:iq:privacy",new PrivacyProvider());
        pm.addIQProvider("command","http://jabber.org/protocol/commands",
                newAdHocCommandDataProvider());
        pm.addExtensionProvider("malformed-action",
                "http://jabber.org/protocol/commands",
                newAdHocCommandDataProvider.MalformedActionError());
        pm.addExtensionProvider("bad-locale",
                "http://jabber.org/protocol/commands",
                newAdHocCommandDataProvider.BadLocaleError());
        pm.addExtensionProvider("bad-payload",
                "http://jabber.org/protocol/commands",
                newAdHocCommandDataProvider.BadPayloadError());
        pm.addExtensionProvider("bad-sessionid",
                "http://jabber.org/protocol/commands",
                newAdHocCommandDataProvider.BadSessionIDError());
        pm.addExtensionProvider("session-expired",
                "http://jabber.org/protocol/commands",
                newAdHocCommandDataProvider.SessionExpiredError());
    }
 
    publicboolean register(String account, String password) {
        Registration reg =new Registration();
        reg.setType(IQ.Type.SET);
        reg.setTo(connection.getServiceName());
        reg.setUsername(account);// 注意这里createAccount注册时,参数是username,不是jid,是“@”前面的部分。
        reg.setPassword(password);
        reg.addAttribute("android","geolo_createUser_android");// 这边addAttribute不能为空,否则出错。所以做个标志是android手机创建的吧!!!!!
        PacketFilter filter =new AndFilter(newPacketIDFilter(
                reg.getPacketID()),new PacketTypeFilter(IQ.class));
        PacketCollector collector = connection.createPacketCollector(filter);
        connection.sendPacket(reg);
        IQ result = (IQ) collector.nextResult(SmackConfiguration
                .getPacketReplyTimeout());
        if(result == null) {
            MLog.makeText("连接超时");
        }else if(result.getType() == IQ.Type.RESULT) {
            MLog.makeText("注册成功");
            returntrue;
        }else {
            MLog.makeText(result.getError().toString());
        }
        returnfalse;
    }
 
    publicboolean login(String userName, String userPwd) {
        try{
            connection.login(userName, userPwd);
            user = userName +"@" + connection.getServiceName();
            returntrue;
        }catch (Exception e) {
            e.printStackTrace();
        }
        MLog.makeText("登录失败");
        returnfalse;
    }
 
    publicvoid changePassword(String pwd) {
        try{
            connection.getAccountManager().changePassword(pwd);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 更改用户状态
     */
    publicvoid setPresence(intcode) {
        Presence presence =null;
        switch(code) {
        case0:
            presence =new Presence(Presence.Type.available);
            connection.sendPacket(presence);
            MLog.makeText("设置在线");
            break;
        case1:
            presence =new Presence(Presence.Type.available);
            presence.setMode(Presence.Mode.chat);
            connection.sendPacket(presence);
            MLog.makeText("设置Q我吧");
            break;
        case2:
            presence =new Presence(Presence.Type.available);
            presence.setMode(Presence.Mode.dnd);
            connection.sendPacket(presence);
            MLog.makeText("设置忙碌");
            break;
        case3:
            presence =new Presence(Presence.Type.available);
            presence.setMode(Presence.Mode.away);
            connection.sendPacket(presence);
            MLog.makeText("设置离开");
            break;
        case4:
            Roster roster = connection.getRoster();
            Collection<RosterEntry> entries = roster.getEntries();
            for(RosterEntry entry : entries) {
                presence =new Presence(Presence.Type.unavailable);
                presence.setPacketID(Packet.ID_NOT_AVAILABLE);
                presence.setFrom(connection.getUser());
                presence.setTo(entry.getUser());
                connection.sendPacket(presence);
            }
            // 向同一用户的其他客户端发送隐身状态
            presence =new Presence(Presence.Type.unavailable);
            presence.setPacketID(Packet.ID_NOT_AVAILABLE);
            presence.setFrom(connection.getUser());
            presence.setTo(StringUtils.parseBareAddress(connection.getUser()));
            connection.sendPacket(presence);
            MLog.makeText("设置隐身");
            break;
        case5:
            presence =new Presence(Presence.Type.unavailable);
            connection.sendPacket(presence);
            MLog.makeText("设置离线");
            break;
        default:
            break;
        }
    }
 
    publicvoid logoutAccount() {
        try{
            connection.getAccountManager().deleteAccount();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    publicCollection<RosterGroup> getGroups() {
        returnconnection.getRoster().getGroups();
    }
 
    publicList<RosterEntry> getEntriesByGroup(String groupName) {
        List<RosterEntry> Entrieslist =new ArrayList<RosterEntry>();
        RosterGroup rosterGroup = connection.getRoster().getGroup(groupName);
        Collection<RosterEntry> rosterEntry = rosterGroup.getEntries();
        Iterator<RosterEntry> i = rosterEntry.iterator();
        while(i.hasNext()) {
            Entrieslist.add(i.next());
        }
        returnEntrieslist;
    }
 
    publicDrawable getUserImage(String user) {
        ByteArrayInputStream bais =null;
        try{
            VCard vcard =new VCard();
            // 加入这句代码,解决No VCard for
            ProviderManager.getInstance().addIQProvider("vCard","vcard-temp",
                    neworg.jivesoftware.smackx.provider.VCardProvider());
            if(user == "" || user == null || user.trim().length() <= 0) {
                returnnull;
            }
            vcard.load(connection, user +"@" + connection.getServiceName());
            if(vcard == null || vcard.getAvatar() == null)
                returnnull;
            bais =new ByteArrayInputStream(vcard.getAvatar());
            BitmapDrawable drawable =new BitmapDrawable(bais);
            bais.close();
            returndrawable;
        }catch (Exception e) {
            e.printStackTrace();
        }
        returnnull;
    }
 
    publicList<RosterEntry> getAllEntries() {
        List<RosterEntry> Entrieslist =new ArrayList<RosterEntry>();
        Collection<RosterEntry> rosterEntry = connection.getRoster()
                .getEntries();
        Iterator<RosterEntry> i = rosterEntry.iterator();
        while(i.hasNext()) {
            Entrieslist.add(i.next());
        }
        returnEntrieslist;
    }
 
    publicboolean addGroup(String groupName) {
        try{
            connection.getRoster().createGroup(groupName);
            MLog.makeText("创建成功");
            returntrue;
        }catch (Exception e) {
            e.printStackTrace();
        }
        returnfalse;
    }
 
    /**
     * 添加好友 无分组
     *
     * @param userName
     * @param name
     * @return
     */
    publicboolean addUser(String userName, String name) {
        try{
            String account = userName +"@" + connection.getServiceName();
            connection.getRoster().createEntry(account, name,null);
            returntrue;
        }catch (Exception e) {
            e.printStackTrace();
        }
        returnfalse;
    }
 
    publicboolean addUserWithName(String userName, String name,
            Presence.Type type) {
        returnaddUserWithName(userName, name, XMsgConst.X_DEFAULT_GROUP, type);
    }
 
    /**
     * 添加好友 有分组
     *
     * @param userName
     * @param name
     * @param groupName
     * @return
     */
    publicboolean addUserWithName(String userName, String name,
            String groupName, Presence.Type type) {
        try{
            Presence subscription =new Presence(type);
            subscription.setTo(userName);
            userName +="@" + connection.getServiceName();
            connection.sendPacket(subscription);
            if(type == Type.subscribed)
                connection.getRoster().createEntry(userName, name,
                        newString[] { groupName });
            returntrue;
        }catch (Exception e) {
            e.printStackTrace();
            returnfalse;
        }
    }
 
    publicboolean removeUser(String userName) {
        try{
            RosterEntry entry =null;
            if(userName.contains("@"))
                entry = connection.getRoster().getEntry(userName);
            else
                entry = connection.getRoster().getEntry(
                        userName +"@" + connection.getServiceName());
            if(entry == null)
                entry = connection.getRoster().getEntry(userName);
            connection.getRoster().removeEntry(entry);
            returntrue;
        }catch (Exception e) {
            e.printStackTrace();
        }
        returnfalse;
    }
 
    publicList<XUserItem> searchUsers(String userName) {
        List<XUserItem> results =new ArrayList<XUserItem>();
        try{
            UserSearchManager usm =new UserSearchManager(connection);
            String serverDomain ="search." + connection.getServiceName();
            Form searchForm = usm.getSearchForm(serverDomain);
            Form answerForm = searchForm.createAnswerForm();
            answerForm.setAnswer("Username",true);
            answerForm.setAnswer("search", userName);
            ReportedData data = usm.getSearchResults(answerForm, serverDomain);
            Iterator<Row> it = data.getRows();
            Row row =null;
            XUserItem user =null;
            while(it.hasNext()) {
                row = it.next();
                String uName = row.getValues("Username").next().toString();
                String Name = row.getValues("Name").next().toString();
                String Email = row.getValues("Email").next().toString();
                user =new XUserItem(uName, Name, Email);
                results.add(user);
            }
            returnresults;
        }catch (XMPPException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        returnresults;
    }
 
    publicvoid sendMessage(String toJID, String message) {
        // TODO Auto-generated method stub
        finalMessage newMessage = newMessage(toJID, Message.Type.chat);
        newMessage.setBody(message);
        connection.sendPacket(newMessage);
    }
 
    @Override
    publicvoid connectionClosed() {
        // TODO Auto-generated method stub
        MLog.makeText("连接已关闭");
    }
 
    @Override
    publicvoid connectionClosedOnError(Exception arg0) {
        // TODO Auto-generated method stub
        MLog.makeText("连接关闭异常");
        arg0.printStackTrace();
    }
 
    @Override
    publicvoid reconnectingIn(intarg0) {
        // TODO Auto-generated method stub
        MLog.makeText("reconnectingIn:"+ arg0);
    }
 
    @Override
    publicvoid reconnectionFailed(Exception arg0) {
        // TODO Auto-generated method stub
        MLog.makeText("连接失败");
        arg0.printStackTrace();
    }
 
    @Override
    publicvoid reconnectionSuccessful() {
        // TODO Auto-generated method stub
        MLog.makeText("重连成功");
    }
 
    @Override
    publicvoid connectionCreated(Connection arg0) {
        // TODO Auto-generated method stub
        BroadSender.sendBroadcast(SplashActivity.class);
    }
 
    @Override
    publicvoid processPacket(Packet packet) {
        // TODO Auto-generated method stub
        if(packet instanceofMessage) {
            Message msg = (Message) packet;
            CacheUtils.getInstance().addMessage(msg);
            BroadSender.sendBroadcast(ChatActivity.class,"action",
                    XMsgConst.X_PACKET_TYPE_MESSAGE);
        }else if(packet instanceofPresence) {
            Presence presence = (Presence) packet;
            String from = presence.getFrom();// 发送方
            String to = presence.getTo();// 接收方
            Type type = presence.getType();
            inttypeValue = 0;
            if(type.equals(Presence.Type.subscribe)) {
                // 好友申请
                typeValue = XMsgConst.X_PRESENCE_SUBSCRIBE;
            }else if(type.equals(Presence.Type.subscribed)) {
                // 同意添加好友
                typeValue = XMsgConst.X_PRESENCE_SUBSCRIBED;
            }else if(type.equals(Presence.Type.unsubscribe)) {
                // 拒绝添加好友
                typeValue = XMsgConst.X_PRESENCE_UNSUBSCRIBE;
            }else if(type.equals(Presence.Type.unsubscribed)) {
                // 删除好友
                typeValue = XMsgConst.X_PRESENCE_UNSUBSCRIBED;
            }else if(type.equals(Presence.Type.unavailable)) {
                // 好友下线
                typeValue = XMsgConst.X_PRESENCE_UNAVAILABLE;
                from = processFrom(from);
                CacheUtils.getInstance().putPresence(from, presence);
            }else {
                // 好友上线
                typeValue = XMsgConst.X_PRESENCE_ONLINE;
                from = processFrom(from);
                CacheUtils.getInstance().putPresence(from, presence);
            }
            String[] params =new String[] { "action",
                    XMsgConst.X_PACKET_TYPE_PRESENCE,"type",
                    String.valueOf(typeValue),"from", from, "to", to };
            BroadSender.sendBroadcast(MainActivity.class, params);
        }
    }
 
    /**
     * 去掉多余的服务器字符串
     *
     * @param from
     * @return
     */
    privateString processFrom(String from) {
        intendPos = from.lastIndexOf("/");
        if(endPos != -1)
            from = from.substring(0, endPos);
        returnfrom;
    }
 
}

0 0