2013-05-29 49 views
1

我正在一個android聊天應用程序中,我正在使用smack庫進行即時消息傳遞,一切工作正常,但巨大的問題是訂閱。Android smack庫訂閱(不顯示inbond或outbond通知)

如何向其他用戶發送訂閱通知。

這裏是我的發送訂閱請求代碼:

public void run() { 
     /*runOnUiThread(new Runnable() { 
      public void run() {*/ 
       Roster roster = XMPPSmackConnection.getInstance().connection.getRoster(); 
       roster.setSubscriptionMode(Roster.SubscriptionMode.manual); 
       try { 
        if(!_userName.contains("@")) 
         _userName=_userName+"@www.naijapings.net"; 

        /*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"); 
        XMPPSmackConnection.getInstance().connection.sendPacket(presence_request); 
        roster.createEntry(presence.getFrom(), null, null);*/ 

        /*Presence response = new Presence(Presence.Type.subscribe); 
        response.setTo(_userName); 
        XMPPSmackConnection.getInstance().connection.sendPacket(response);*/ 

        //PROCESS TWO WAY COMMUNICATION 
        Presence response1 = new Presence(Presence.Type.subscribe); 
        response1.setTo(_userName); 
        XMPPSmackConnection.getInstance().connection.sendPacket(response1); 
        ////////////////////////////////////////////////////// 

        //roster.createEntry(_userName, null, null); 

        /*roster.createEntry(_userName, _nickName, Friends);*/ 
        //roster.createEntry(_tempUserName, null, null); 
        //roster.createEntry(_userName, _nickName, my_friends[]); 
        //addBuddy(_userName, _nickName, Friends); 
       } catch (Exception e) { 
        _progDailog.dismiss(); 
        e.printStackTrace(); 
       } 
       _progDailog.dismiss(); 
       successAlert("Buddy requested successfully"); 
      /*} 
     });*/ 

上面的代碼只能建立名冊進入其他用戶的陣容名單,但沒有顯示訂閱通知。

這裏是接受預訂請求代碼:

runOnUiThread(new Runnable() { 
       public void run() { 
        try { 
         Roster roster = XMPPSmackConnection.getInstance().connection.getRoster(); 
         ///roster.setSubscriptionMode(Roster.SubscriptionMode.manual); 
         //Presence presence = roster.getPresence(_buddyUserName); 
         roster.setSubscriptionMode(Roster.SubscriptionMode.manual); 
         //Presence subscribed = new Presence(Presence.Type.subscribed); 

         Presence response = new Presence(Presence.Type.subscribed); 
         response.setTo(_buddyUserName); 
         XMPPSmackConnection.getInstance().connection.sendPacket(response); 

         /*response = new Presence(Presence.Type.subscribed); 
         response.setTo(_buddyUserName); 
         XMPPSmackConnection.getInstance().connection.sendPacket(response);*/ 

         roster.createEntry(_buddyUserName, _nickNameEditText.getText().toString(), Friends); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 

請建議的確切情況。

+0

大家好,是否有任何解決方案? –

回答

0

爲了接收訂閱請求,你必須:

1)發送存在:

<presence/> 

2)獲取名冊:

<iq type='get' id='roster1'> 
    <query xmlns='jabber:iq:roster'/> 
</iq> 

首次客戶作家常常驚訝由第二個。

+0

感謝您回覆Joe,但如果我錯了某處,我也會這樣做,請讓我知道。 –

1

好的,我在這工作了幾天,終於有了工作。我已經用手動訂閱模式實現了它(即,用戶需要手動接受其他用戶的請求)。

如果用戶沒有發送訂閱或退訂,服務器會一直向用戶推送訂閱請求(在重新登錄時)。因此,您可以將傳入的訂閱請求本地保存在列表中,並將其顯示爲手動接受/拒絕的「朋友請求列表」。如果您的應用程序重新啓動(並因此重新連接到服務器),服務器將再次推送訂閱請求。

這是它如何工作的:

  • 用戶1發送訂閱存在用戶2。
  • 花名冊條目會自動在User1的花名冊中創建(但不在User2的花名冊中)。
  • 用戶2接收來自用戶1的訂閱請求。
  • 用戶2向用戶2發送訂閱的狀態(用戶2>用戶1訂閱完成)。
  • User2檢查User1是否在User2的名單中。 User1不在User2的名單中。用戶2向用戶1發送訂閱狀態。
  • 名冊條目會自動在User2的名單中創建。
  • 用戶1接收來自用戶2的訂閱存在。
  • User1檢查User2是否在User1的名單中。 User2在User1的名單中。用戶1向用戶2發回訂閱的狀態(用戶2>用戶1訂閱完成)。

     final Presence newPresence = (Presence) packet; 
         final Presence.Type presenceType = newPresence.getType(); 
         final String fromId = newPresence.getFrom(); 
         final RosterEntry newEntry = getRoster().getEntry(fromId); 
    
         if (presenceType == Presence.Type.subscribe) 
         { 
          //from new user 
          if (newEntry == null) 
          { 
           //save request locally for later accept/reject 
           //later accept will send back a subscribe & subscribed presence to user with fromId 
           //or accept immediately by sending back subscribe and unsubscribed right now 
          } 
          //from a user that previously accepted your request 
          else 
          { 
           //send back subscribed presence to user with fromId 
          } 
         } 
    
0

你不能發送訂閱這樣的,做這種方式:

Presence subscription = new Presence(
       Presence.Type.subscribe); 
     subscription.setTo(CurrentUser+"@reza-hp"); 
     subscription.setPriority(24); 
     newp.setMode(Presence.Mode.available); 
     connection.sendPacket(subscription);