流水不争先,争的是滔滔不绝

Android(xmpp+smack+openfire)高仿QQ即时通讯【3】添加分组,添加好友,读取好友列表的实现

openfire 云聊IM 2043℃

我利用xmpp协议写的Spark作为另一个客户端,与我自己建的QQ客户端进行测试。

首先下载Spark,安装,配置,可以用我们openfire服务端建立的帐号进行登录。

首先 先添加好友,添加组,然后读取好友列表,我这个地方写的简单,可以借鉴,自己优化。

登录成功后,点击menu按钮,可以出现底部菜单,添加好友。

点击 添加好友进入,添加好友页面:

输入好友名称,可以搜索服务端有的帐号,搜索与添加好友代码:

public void searchFriend() {    
    String search_text = ((EditText) findViewById(R.id.search_text)).getText().toString();
    if (search_text.equals("")) {
        Toast.makeText(FriendAddActivity.this, "输入信息不能为空!", Toast.LENGTH_SHORT).show();
    } else {
        try{
            XMPPConnection connection = XmppConnection.getConnection();
            UserSearchManager search = new UserSearchManager(connection);
            //此处一定要加上 search.
            Form searchForm = search.getSearchForm("search."+connection.getServiceName());
            Form answerForm = searchForm.createAnswerForm();
            answerForm.setAnswer("Username", true);
            answerForm.setAnswer("search", search_text.toString().trim());
            ReportedData data = search.getSearchResults(answerForm,"search."+connection.getServiceName());                  
            Iterator it = data.getRows();
            Row row=null;
            while(it.hasNext()){
                row=it.next();
                queryResult=row.getValues("Username").next().toString();
            }
        }catch(Exception e){
            Toast.makeText(FriendAddActivity.this,e.getMessage()+" "+e.getClass().toString(), Toast.LENGTH_SHORT).show();
        }
        if(!queryResult.equals("")){
            // 生成动态数组,加入数据
            ArrayList> listItem = new ArrayList>();
                HashMap map = new HashMap();         
                map.put("name", queryResult); //会员昵称
                listItem.add(map);
            // 生成适配器的Item和动态数组对应的元素
            SimpleAdapter listItemAdapter = new SimpleAdapter(this, listItem,// 数据源
                    R.layout.friend_search_view,// ListItem的XML实现
                    // 动态数组与ImageItem对应的子项
                    new String[] { "name", },
                    // ImageItem的XML文件里面的一个ImageView,两个TextView ID
                    new int[] { R.id.itemtext });
            // 添加并且显示
            list.setAdapter(listItemAdapter);
            // 添加短点击事件
            list.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView parent, View view,
                        int position, long id) {
                    HashMap map = (HashMap) list.getItemAtPosition(position);
                    final String name = map.get("name");
                    AlertDialog.Builder dialog=new AlertDialog.Builder(FriendAddActivity.this);
                    dialog.setTitle("添加好友")
                          .setIcon(R.drawable.default_head)
                          .setMessage("您确定要添加【"+name+"】为好友吗?")
                          .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                     @Override
                                     public void onClick(DialogInterface dialog, int which) {        
                                         // TODO Auto-generated method stub 
                                         Roster roster = XmppConnection.getConnection().getRoster();
                                         String userName = name+"@"+XmppConnection.getConnection().getServiceName();
                                         //默认添加到【我的好友】分组
                                         String groupName = "我的好友";
                                         XmppService.addUsers(roster, userName, name, groupName);
                                         Presence subscription = new Presence(Presence.Type.subscribe);
                                         subscription.setTo(userName);
                                         dialog.cancel();//取消弹出框
                                         finish();
                                         Intent intent = new Intent();
                                         intent.putExtra("USERID", pUSERID);
                                         intent.putExtra("GROUPNAME", groupName);
                                         intent.setClass(FriendAddActivity.this, FriendListActivity.class);
                                         startActivity(intent);
                                     }
                                   })
                           .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                     public void onClick(DialogInterface dialog, int which) {            
                                         // TODO Auto-generated method stub
                                         dialog.cancel();//取消弹出框
                                     }
                                   }).create().show();
                       }
                 });    
          }else{
              Toast.makeText(FriendAddActivity.this, "此用户不存在,请确保输入的信息正确!", Toast.LENGTH_SHORT).show();
          }
    }
}

搜索到好友后,直接点击添加,会添加到默认分组【我的好友】,也可以在搜索到好友后,将其添加到新建分组中,也可以即时聊天,这是我的设计。

添加组代码:

String groupName = addFriend.getText().toString().trim();
if (groupName.equals("") || groupName.equals("")) {
    Toast.makeText(FriendAddActivity.this, "群组名称不能为空!", Toast.LENGTH_SHORT).show();
} else {
    boolean result = false;
    result = XmppService.addGroup(roster, groupName);
    if (result) {
         Roster roster = XmppConnection.getConnection().getRoster();
         String userName = queryResult+"@"+XmppConnection.getConnection().getServiceName();
         XmppService.addUsers(roster, userName, queryResult, groupName);
         Intent intent = new Intent();
         intent.putExtra("USERID", pUSERID);
         intent.setClass(FriendAddActivity.this, FriendListActivity.class);
         startActivity(intent);
    } else {
        Toast.makeText(FriendAddActivity.this, "群组添加失败!", Toast.LENGTH_SHORT).show();
    }
}

当你确定添加后,Spark端会收到添加好友请求。

接受后,两面都可以看见彼此了,要是自建客户端好友未出现,点击刷新列表,就能看见了。

以下是自建客户端,读取好友列表的代码:

public void loadFriend() {
    try {
        XMPPConnection conn = XmppConnection.getConnection();
        Roster roster = conn.getRoster();
        Collection groups = roster.getGroups();
        groupList = new ArrayList();
        for (RosterGroup group : groups) {
            groupInfo = new GroupInfo();
            friendList = new ArrayList();
            groupInfo.setGroupName(group.getName());
            Collection entries = group.getEntries();
            for (RosterEntry entry : entries) {
                if("both".equals(entry.getType().name())){//只添加双边好友 
                    friendInfo = new FriendInfo();
                    friendInfo.setUsername(Utils.getJidToUsername(entry.getUser()));
                    System.out.println("我的好友心情是:"+entry.getStatus().fromString(entry.getUser()));
                    if(friendMood == null){
                        friendMood ="Q我吧,静待你的来信!";
                    }
                    friendInfo.setMood(friendMood);
                    friendList.add(friendInfo);
                    friendInfo = null;          
                }
            }
            groupInfo.setFriendInfoList(friendList);
            groupList.add(groupInfo);
            groupInfo = null;
        }
    if(groupList.isEmpty()){
        groupInfo = new GroupInfo();
        groupInfo.setGroupName("我的好友");
        groupInfo.setFriendInfoList(new ArrayList());
        groupList.add(groupInfo);
        groupInfo = null;
    }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

本文转自:http://blog.csdn.net/yuanqihesheng/article/details/8875599

版权声明:部分文章、图片等内容为用户发布或互联网整理而来,仅供学习参考。如有侵犯您的版权,请联系我们,将立刻删除。
点击这里给我发消息