2017-02-20 153 views
0

我正在聊天的應用程序中,我可以發送消息,圖像,視頻等 我已經在一對一的聊天做到這一點,也可以在羣聊中完成它。 但問題是: - 我每次登錄時都必須加入每個組,否則我無法接收來自不同組的消息。沒有收到多用戶聊天消息Xmpp samck android

這裏是我每次加入組的方式。

MultiUserChat muc= new MultiUserChat(mConnection,"[email protected]"); 
    String userNAme ="222222222"; 
muc.join(userNAme); 

如果我不加入組,每次我都不接收郵件。 如果我加入組我開始收到郵件。

我的問題是這是唯一的解決方案或所有羣聊這樣工作。 還是我在做一些錯誤的事情
我google了,但沒有找到任何解決方案。 如果是重複的問題,或涉及到我的問題,請分享鏈接 感謝

這任何回答是代碼: -

public boolean createChatRoom() { 
     String name = edtGroupName.getText().toString(); 
     if (!(connection.isConnected() && name.length() != 0)) { 
      return false; 
     } 
     try { 
      // Create a MultiUserChat 

      String userName = Utils.covertIntoSubString(connection.getUser(), Constant.AT); 
      roomName = (name + md5String(getDateTime()) + userName + Constant.CONFERENCE + connection.getServiceName()).replaceAll(" ", ""); 
      MultiUserChat muc = new MultiUserChat(connection, roomName); 

      // Create a chat room 
      muc.create(roomName); 
      // set Room Name as room subject 
      muc.changeSubject(name);// RoomName room name 


      // To obtain the chat room configuration form 
      Form form = muc.getConfigurationForm(); 
      // Create a new form to submit the original form according to the. 
      Form submitForm = form.createAnswerForm(); 
      // To submit the form to add a default reply 
      for (Iterator<FormField> fields = form.getFields(); fields 
        .hasNext();) { 
       FormField field = (FormField) fields.next(); 
       if (!FormField.TYPE_HIDDEN.equals(field.getType()) 
         && field.getVariable() != null) { 
        // Set default values for an answer 
        submitForm.setDefaultAnswer(field.getVariable()); 
       } 
      } 

      // Set the chat room of the new owner 
      List<String> owners = new ArrayList<String>(); 
      owners.add(connection.getUser());// The user JID 
//   submitForm.setAnswer("muc#roomconfig_roomowners", owners); 
      // Set the chat room is a long chat room, soon to be preserved 
      submitForm.setAnswer("muc#roomconfig_persistentroom", true); 
      // chat room is public 
      submitForm.setAnswer("muc#roomconfig_publicroom", true); 
      // Allows the user to modify the nickname 
      submitForm.setAnswer("x-muc#roomconfig_canchangenick", true); 
      // Allows the possessor to invite others 
//   submitForm.setAnswer("muc#roomconfig_allowinvites", true); 

//   submitForm.setAnswer("muc#roomconfig_enablelogging", true); 
      // Only allow registered nickname log 
//   submitForm.setAnswer("x-muc#roomconfig_reservednick", true); 

      // Allows the user to register the room 
//   submitForm.setAnswer("x-muc#roomconfig_registration", true); 

      muc.sendConfigurationForm(submitForm); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 

     return true; 
    } 
public void inviteFriends(String userJid) { 
    try { 
     String groupName = edtGroupName.getText().toString(); 
     Message msg = new Message(); 
     msg.setBody(groupName); 
     MultiUserChat muc = new MultiUserChat(connection, roomName); 
     if (muc != null) { 
      muc.grantMembership(userJid); 
      muc.invite(msg, userJid, groupName); 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

public void invitationrecvd(){ 
MultiUserChat chatRoom = new MultiUserChat(con, rum); 
        try { 
         chatRoom.join(userName); 
         saveGroupsToDb(userName + Constant.AT + Constant.HOST + Constant.SLASHSMACK, rum, group); 

        } catch (Exception e) { 
         e.printStackTrace(); 
        } 

} 

,這是主屏幕上的羣消息監聽器

PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat); 
     groupMessagesListeners = new GroupMessagesListeners(); 
     mConnection.addPacketListener(groupMessagesListeners,filter); 

回答

1

該羣聊被髮送到XMPP muc(多用戶聊天),因此您需要加入muc才能接收在該羣組中發送的消息。您可以在https://xmpp.org/extensions/xep-0045.html中閱讀更多關於此的信息。

這裏是從鏈路的摘錄:

7.2.1 GROUPCHAT 1.0協議

爲了參加在多用戶聊天室 進行的討論,用戶必須首先通過進入房間成爲佔用者。在 舊羣聊1.0協議,這是通過發送存在與 no'type'屬性來完成的,其中「room」是房間 ID,「service」是聊天服務的主機名,「nick」是在房間內 用戶所需的暱稱:

+0

問題是我必須重新加入已加入的組才能收到消息...否則我無法收到消息反對我是組的成員...... –

+0

加入後您是否離開組?可能每隔10秒發送一次你仍然是房間的一部分 – manishg

+0

不,我不離開該組我是組的一部分,但不接收消息...我不知道最新錯誤... –

0

或多或少我已經回答了這種答案的,但你的代碼,它是更清潔(Can't able to receive group chat messages using smack-android:4.1.4)。

1)當你創建一個多用戶聊天,爲了完成它,你必須加入這個聊天室,或者它只是被配置但不是仍然活動的房間。

muc.sendConfigurationForm(submitForm); 
muc.join("My Nickname","password"); //omit password if not needed 

2)自動加入您的groupchats,您可以使用PubSub的功能 與嫌片段可以是這樣的:

BookmarkManager bookmarkManager = BookmarkManager.getBookmarkManager(mConnection); 
bookmarkManager.addBookmarkedConference 
     ("My roomname label", 
     roomName, 
     true, 
     "My Nickname", 
     password); 

添加此代碼時:

  • 你創建羣聊
  • 您接受羣聊邀請。

(要刪除書籤,只需:

this.bookmarkManager.removeBookmarkedConference(roomName) 

最後,登錄後,添加一個方法來自動聯接的羣聊:

List<BookmarkedConference> list = BookmarkManager.getBookmarkManager(mConnection).getBookmarkedConferences(); 

     MultiUserChat muc; 
     for (BookmarkedConference conference : list) 
     { 
      System.out.println("- Conference with bookmark: " + conference.getName() + 
        " and jid: " + conference.getJid()); 


      if ((muc = multiUserChatManager.getMultiUserChat(conference.getJid())) != null 
      && conference.isAutoJoin()) 
       { 

        muc.join("My Nickname"); 
         //foo 
    } 
} 

這個你有後全部用於配置和管理你的羣組。我個人不喜歡在mConnection中增加一個通用的PacketListener,這是由於後續難以同步前端的消息,但這將最終成爲另一個分支。

+0

感謝朋友詳細調查代碼。但是你分享的東西總是加入我們創建的房間......而我的問題是,每當我們已經成爲成員時,我們不需要加入任何空間。或者它是唯一的解決方案。謝謝@MrPk –

+0

唯一的解決方案。成爲會員(所有者,管理員,成員,棄兒)只會給你的權利做一些事情(如變更主題等),但理論上可以將管理員用戶添加爲默認的所有者,當然他不需要收到任何消息。基本上你會收到來自Time TJ(加入)直到Time TL(左)的消息,其他配置只是配置。 – MrPk

+0

所以我的理解是我必須每次啓動應用程序時加入所有組。所以在此之後,我開始接收來自加入和離開團體的消息。 –