2012-11-12 59 views
1

在我的应用程序时,我有添加好友我通常发送订阅包4倍 即注销添加好友在XMPP咂嘴

A-> B(订阅) B-> A(认购) BA(订阅) A-> B(订阅)

每个步骤I的状态立即改变在服务器上看到后。

但是在我的应用程序中,它只能在LOGGING OUT和LOGGING之后再次反映出来。 在他添加好友之后,他必须注销一次,然后他的好友名单上将显示好友>

问题是什么?我已经找到了很多,但因此未发现任何错误:(

没有错误显示在logcat中。

我还印制了syso输出的每个数据包被发送后,它总是说为NONE(此案。发送请求的人)和总是说TO/FROM(在发送好友请求的用户的情况下)。两者都没有被反映出来,直到一个人退出并重新登录。

请帮我:(

Add Friend Function 

public boolean addFriend(String jid) { 
     String nickname = null; 
     String idExtension = jid+"@abc.hostname.com"; 
     nickname = StringUtils.parseBareAddress(jid); 
     if (!roster.contains(idExtension)) { 
      try { 
       roster.createEntry(idExtension, nickname, null); 
       //to subscribe the user in the entry 
       Presence subscribe = new Presence(Presence.Type.subscribe); 
       subscribe.setTo(idExtension);    
       connection.sendPacket(subscribe); 
       return true; 

      } catch (XMPPException e) { 
       System.err.println("Error in adding friend"); 
       return false; 
      } 
     } else { 
      return false; 
     } 
    } 

它会se ND通知其他用户..在允许此代码被写入: -

btn_Allow = (Button)findViewById(R.id.btn_manageNotification_ALLOW); 
     btn_Allow.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 

       //accept the friends subscription 
       Presence subscribed = new Presence(Presence.Type.subscribed); 
       subscribed.setTo(id);    
       connection.sendPacket(subscribed); 



       mCustomProgressDialog = CustomProgressDialog.createDialog(
         ManageNotification.this, "", ""); 
       mCustomProgressDialog.show(); 
       mCustomProgressDialog.setCancelable(false); 
       new Thread(){ 
        public void run() { 

         try { 
          sleep(5000); 
          //mXmconn.getContactList(); 

          /*Presence subscribed = new Presence(Presence.Type.subscribe); 
          subscribed.setTo(id);    
          System.out.println("The user is :"+id); 
          connection.sendPacket(subscribed);*/ 

         } catch (InterruptedException e) {}      
         mReturnUserMenu.sendEmptyMessage(0); 

        }; 
       }.start(); 
      } 
     }); 

相同则再次上进行再次允许谁发起请求的用户。

请帮忙。订阅状态在服务器上立即发生变化,但是在注销一次后它将更新。

这里是代表名单

public void getContactList(){ 

     roster = connection.getRoster(); 

     Collection<RosterEntry> entries = roster.getEntries(); 
     System.out.println("Total=="+entries.size()); 
     mfriendList.clear(); 
     mfriendPendingList.clear(); 
     mfriendRequestList.clear(); 
     for (RosterEntry entry : entries) { 
      mFriendsDataClass = new FriendsDataClass(); 

      mFriendsDataClass.friendName = entry.getUser().toString(); 

      String user = entry.getUser(); 

      int index_of_Alpha = user.indexOf("@"); 
      /*System.out.println("The current working user is : "+user); 
      System.out.println("His status is"+entry.getType().toString());*/ 
      String subID = user.substring(0, index_of_Alpha); 
      Presence availability = roster.getPresence(user); 
      Mode userMode = availability.getMode(); 

      mFriendsDataClass.availability = ""; 
      mFriendsDataClass.friendNickName = subID;   
      mFriendsDataClass.friendStatus = stusMsg.toString(); 
      mFriendsDataClass.friendState = retrieveState_mode(availability.getMode(),availability.isAvailable()); 
      if(entry.getType().toString().equalsIgnoreCase("to")){ 
       //getContactList(); 
       mfriendRequestList.add(mFriendsDataClass); 
      }else if(entry.getType().toString().equalsIgnoreCase("from")){ 
       //getContactList(); 
       mfriendPendingList.add(mFriendsDataClass); 
      }else if(entry.getType().toString().equalsIgnoreCase("both")){ 
       //getContactList(); 
       mfriendList.add(mFriendsDataClass); 
      }   
     } 
    } 

感谢

+0

请提供一些代码,因为它很难回答这个使用这个场景,但我会建议你做一个刷新按钮,它可以作为一个登录,并再次重新加载的一切,你也可以保存用户名称和密码,并重新登录,而用户不知道它 –

+0

@GirishNair用户正在与其他人聊天什么?连接将丢失然后? 有什么办法刷新xmpp连接? :( –

+0

保存聊天信息,并尝试重新加载。你有没有检查过这个http://stackoverflow.com/questions/9632865/reset-the-xmpp-connection-if-the-page-gets-refreshed –

回答

2

要发送,你必须使用一个请求的代码,

roster.createEntry("mail_id", null, null); 

而对于Listening请求您在使用听PacketListener。并检查Presence

Presence presence = (Presence) packet; 
Presence presence_request = new Presence(Presence.Type.subscribed); 
presence_request.setTo(presence.getFrom()); 
presence_request.setType(Presence.Type.subscribed); 
presence_request.setFrom("current_logged_in_user"); 
connection.sendPacket(presence_request); 
roster.createEntry(presence.getFrom(), null, null); 
+0

我已经做了同样的方式和它的工作alrite,但问题是我必须注销每次看看这些变化:( –

+0

我在上面的解决方案中遇到了一个问题,当我在数据包监听器中使用上面的代码时,它可以正常工作,但我想在另一个活动中使用其中一个允许按钮来接受frnd请求,然后上面的代码只有 - TO和FROM订阅,而不是BOTH订阅,我怎样才能使用它在ALLOW按钮 –

+0

我使用完全相同的代码与我的价值观 –