openfire学习4------->android客户端聊天开发之聊天功能开发

前面咱们已经把服务器搭建完成,而且在客户端实现了登陆了。服务器


和咱们使用的QQ同样,想想,登陆成功以后呢?确定是要有一个好友列表,经过这个列表,咱们能够选择咱们须要聊天的好友。学习


这里咱们先研究下 xmpp的数据格式,再去实现咱们的好友列表测试

登陆成功后,咱们拿到的是一个链接 connection。spa

而后,经过这个connection,咱们能够去获取里面的角色:Roster roster = connection.getRoster();对象

这里咱们拿到了一个Rosrer对象,再经过这个对象,咱们能够拿到全部的群组    Collection<RosterGroup> entriesGroup = roster.getGroups();事件

再遍历一下全部的组,便拿到了每一个组对应的用户了哦get

    public void getUsers(){
System.out.println("======开始获取组及用户==========");
Roster roster = connection.getRoster();
entriesGroup = roster.getGroups();
System.out.println("组的个数:"+entriesGroup.size());
for(RosterGroup group: entriesGroup){
Collection<RosterEntry> entries = group.getEntries();
System.out.println("=========groupName==="+group.getName());
for (RosterEntry entry : entries) {
Log.i("TAG", "name: "+entry.getName());
System.out.println("组成员名字:"+entry.getName());
}
}
System.out.println("======结束获取组及用户==========");
    }
input

这个就是打印全部组成员的名字的一个方法,固然咱们确定须要将它放到一个listview中去,方便咱们点击后进行聊天it


我就采起最笨的办法了,将全部用户遍历出来,放到一个listview中去spark

ArrayList<RosterEntry> list;

for(RosterGroup group: LoginActivity.entriesGroup){
entries = (Collection<RosterEntry>) group.getEntries();
for (RosterEntry entry : entries) {
Log.i("TAG", "name: "+entry.getName());
System.out.println("组成员名字:"+entry.getName());
list.add(entry);
}
}

用一个listview把list中的全部成员显示出来,这就不写了,我只图快,写的的确也不咋的,相信你们都写的比个人好

到这里,咱们的listview就有了,贴一张我到这步的效果图,你们莫要见笑。

我登陆的是test1,其中已经添加过两个好友  admin  test2


这里只是显示了用户名,其余信息都是本地先写死的,不是用获取到的来显示的。咱们用admin去登陆下spark,在里面咱们能够看到,test1已经处于在线状态了:



给listview添加一个点击事件,正常咱们选择一个联系人,来和他聊天


聊天界面本身倒腾哦,我这就不贴上来了,比较丑(就是下面放了个edittext 和一个button,能够填入消息,点击按钮发送出去)

咱们先作发送消息功能:

咱们上面拿到的对象中,咱们想在connection中确定会有一个和聊天有关的,打开看一下果真;ChatManager cm = LoginActivity.connection.getChatManager();

按钮点击事件这块的代码我粘贴上来


public void onClick(View arg0) {
EditText input=(EditText) findViewById(R.id.chat_input);
String content=input.getText().toString();
try {
ChatManager cm = LoginActivity.connection.getChatManager();
Message m=new Message();
m.setBody(content);
chat.sendMessage(m);
} catch (XMPPException e) {
e.printStackTrace();
}
}

xmpp是经过对象来传输的,这里面的对象本身考虑下是什么意思吧。

至于里面的account啊什么的一些信息,从上个listview点击跳转的时候使用intent带过来(注:那些信息都在以前获得的 RosterEntry对象中)


到这里发一个消息给桌面版的spark看下吧:


看看spark是否收到


最下面是有的哦,前面的是我以前的测试消息,忽略掉啦。


到这里发送消息就完成了。


下面咱们考虑下接收消息:

接收消息咱们不必定是在那个用户的聊天页面中才会显示,也可能在好友页面,忽然一个朋友来消息了,甚至按下menu退出了,又或者...状况太多了,固然,须要知足这样的条件,咱们实现思路确定是用一个service去接收消息,收到消息后用广播广播出去啦。

下面咱们就实现一下接收消息,至于要怎么广播,本身想啦,依需求而定哦


Chat chat=cm.createChat(account, new MessageListener(){
public void processMessage(Chat arg0, Message msg) {
Log.i("---", msg.getFrom()+"说:"+msg.getBody());
//添加消息到聊天窗口


}
});

添加这个监听器就哦了哦,我是直接添加到聊天中去了,其余的无论啦,反正公司如今也不打算用这个的,哈哈哈:

我使用最简单的方法实现发送和接收消息:

send_btn.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
EditText input=(EditText) findViewById(R.id.chat_input);
String content=input.getText().toString();
try {
ChatManager cm = LoginActivity.connection.getChatManager();
Chat chat=cm.createChat(account, new MessageListener(){
public void processMessage(Chat arg0, Message msg) {
Log.i("---", msg.getFrom()+"说:"+msg.getBody());
//添加消息到聊天窗口


}
});
Message m=new Message();
m.setBody(content);
chat.sendMessage(m);
} catch (XMPPException e) {
e.printStackTrace();
}
}
});


代码比较乱见谅了:用spark发送消息后,控制台打印:07-16 14:42:07.472: I/---(21065): admin@im.comit.com.cn/Spark 2.6.3说:ddd

就不贴图了


这就大体完成功能了,固然离作成项目还有一些距离,但愿能帮到须要用到这个作聊天的,或者是但愿学习这个的朋友

相关文章
相关标签/搜索