zoukankan      html  css  js  c++  java
  • openfire学习4---android客户端聊天开发之聊天功能开发

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


    和我们使用的QQ一样,想一想,登录成功之后呢?肯定是要有一个好友列表,通过这个列表,我们可以选择我们需要聊天的好友。


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

    登录成功后,我们拿到的是一个连接 connection。

    然后,通过这个connection,我们可以去获取里面的角色:Roster roster = connection.getRoster();

    这里我们拿到了一个Rosrer对象,再通过这个对象,我们可以拿到所有的群组    Collection<RosterGroup> entriesGroup = roster.getGroups();

    再遍历一下所有的组,便拿到了每个组对应的用户了哦

       

     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("======结束获取组及用户==========");
        }


    这个就是打印所有组成员的名字的一个方法,当然我们肯定需要将它放到一个listview中去,方便我们点击后进行聊天


    我就采取最笨的办法了,将所有用户遍历出来,放到一个listview中去

    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

    就不贴图了


    这就大致完成功能了,当然离做成项目还有一些距离,希望能帮到需要用到这个做聊天的,或者是希望学习这个的朋友

  • 相关阅读:
    Convert、Parse、TryParse、(int)区别及可能引发性能问题
    重写、覆盖、重载、多态几个概念的区别分析
    计算机系统的硬件组成(转)
    如何选择Html.RenderPartial和Html.RenderAction
    位运算(转)
    Java程序员面试中的多线程问题
    请转到控制面板来配置或安装系统组件
    开篇
    DropDownList 不能有多个项被选定!
    有关rollup和cube的使用方法讨论
  • 原文地址:https://www.cnblogs.com/jasonkent27/p/4098442.html
Copyright © 2011-2022 走看看