下面就开始获取用户的联系人:当然返回的是一个List,然后显示到ListView上去,这个就不说了,配置一个adapter适配器就好了。
/**
* 获得所有的联系人列表
*
* @return
*/
public static List<User> getNoGroupUserList(Roster roster) {
List<User> userList = new ArrayList<User>();
// 服务器的用户信息改变后,不会通知到unfiledEntries
for (RosterEntry entry : roster.getUnfiledEntries()) {
userList.add(contacters.get(entry.getUser()).clone());
}
return userList;
}
怎么才能在界面上显示的可以入目一点能,可以使用ExpandableListView,也可以使用类似于查找电话薄中联系人的形式,具体参考这位高手的博文:http://blog.csdn.net/xiaanming/article/details/12684155
这里我就不多说了。
如何创建一个会话呢,我是在listView中添加item的监听事件,然后点击了跳转到回话界面,同时将呼呼信息传递到回话页面,思考一下,怎么才能让创建的回话唯一呢,
我是使用了一个判断,就是判断当前聊天的用户(我们跳转的时候,当然可以获取目前聊天的用户,然后发来消息的用户也能获取),然后对比发来消息的用户,一一致的话
就直接将消息显示在界面上。不是就存入数据库。我只是讲一下思路。
接下来就是发送消息了:
ChatManager chatmanager = XmppConnectionManager.getInstance().getConnection()
.getChatManager();
Chat newChat = chatmanager.createChat(user, null);<span style="white-space:pre"> </span>//user是聊天对象
try {
newChat.sendMessage(message.getText().toString());}catch (XMPPException e)
{
<span style="white-space:pre"> </span>e.printStackTrace();
}
这样就实现了消息的发送,你可以试试看
然后就是监听消息:
ChatManager chatmanager = XmppConnectionManager.getInstance().getConnection().getChatManager();
chatmanager.addChatListener(new ChatManagerListener() {
@Override
public void chatCreated(Chat arg0, boolean arg1) {
// TODO Auto-generated method stub
arg0.addMessageListener(new MessageListener() {
@Override
public void processMessage(Chat arg0, Message arg1) {
// TODO Auto-generated method stub
String result = "" + message.getBody();<span style="white-space:pre"> </span>//这里就获取到了消息的内容,怎么更新随便的,Handler可以,由广播来实现也可以,我是用广播实现的。
<span style="white-space:pre"> </span>String ss = message.getFrom();
<span style="white-space:pre"> </span>System.out.println("user" + ss);
}
});
}
});
发送文件(图片语音都可以文件形式发送):
FileTransferManager fileTransferManager2 = new FileTransferManager(
XmppConnectionManager.getInstance().getConnection());
OutgoingFileTransfer outgoingFileTransfer1 = fileTransferManager2
.createOutgoingFileTransfer(user + "/Spark");//这里为什么要发送两次呢,一个是发给spark,电脑端的,下面是发给客户端
OutgoingFileTransfer outgoingFileTransfer3 = fileTransferManager2
.createOutgoingFileTransfer(user + "/Smack");
System.out.println("user" + user1);
File insfile = new File(cursor.getString(1));//这里参数传入文件路径即可,因为上面代码未贴出,所以这个路径是没什么用的
try {
try {
outgoingFileTransfer1.sendFile(insfile, insfile.getName());
} catch (XMPPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outgoingFileTransfer3.sendFile(insfile, insfile.getName());
} catch (XMPPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
然后就是文件监听
FileTransferManager fileTransferManager = new FileTransferManager( XmppConnectionManager.getInstance().getConnection());
fileTransferManager.addFileTransferListener(new FileTransferListener() {
@Override
public void fileTransferRequest(FileTransferRequest arg0) {
// TODO Auto-generated method stub
try {
File insFile = new File(
Environment.getExternalStorageDirectory() + "/DCIM/"
+ arg0.getFileName());
IncomingFileTransfer infiletransfer = arg0.accept();
infiletransfer.recieveFile(insFile);
// insFile.getAbsolutePath() 接收的文件存储的路径
System.out.println("格式"+arg0.getRequestor());<span style="white-space:pre"> </span>//这是发送人
这节就到这里,下一节可以讲下离线消息的接收了。