android smack 获取分组,Android 基于xmpp协议,smack包,openfire服务端的高仿QQ的即时通讯实现【3】添加分组,添加好友,读取好友列表的实现...

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

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

dad7dbd09d7fe663b8039ceea44dcf4e.png

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

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

377534f8c7c72e4c47ef9dbc075b927f.png

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

f2be46b98a1e391b99d65da7a4680fcc.png

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

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());

Iteratorit = 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>();

HashMapmap = 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) {

HashMapmap = (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();

}

}

}

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

9c1cfd2731f3d7794d1b606b52c1756e.png

添加组代码:

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();

}

}

405ee133b4b588d3024d51e8a3365019.png

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

967fd0d54272f39523d781d8f8ea54cd.png

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

eecbe620afccec793b31941236d25dbc.png

64dd014516afc755309b29f796cbb589.png

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

public void loadFriend() {

try {

XMPPConnection conn = XmppConnection.getConnection();

Roster roster = conn.getRoster();

Collectiongroups = roster.getGroups();

groupList = new ArrayList();

for (RosterGroup group : groups) {

groupInfo = new GroupInfo();

friendList = new ArrayList();

groupInfo.setGroupName(group.getName());

Collectionentries = 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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值