2017-02-20 2 views
0

메시지, 이미지, 비디오 등을 보낼 수있는 채팅 응용 프로그램에서 작업 중입니다. 1 : 1 채팅에서이 작업을 그룹 채팅에서도 수행했습니다. 하지만 문제는 다음과 같습니다. - 로그인 할 때마다 항상 각 그룹에 가입해야합니다. 다른 그룹의 메시지를 수신하지 못했습니다.멀티 유저 채팅을위한 메시지를 수신하지 못합니다. Xmpp samck android

여기에 그룹에 가입하는 방법이 있습니다.

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

메시지를받지 않을 때마다 그룹에 가입하지 않으면. 그룹에 가입하면 메시지 수신이 시작됩니다.

내 질문은 이것이 유일한 해결책이거나 모든 그룹 채팅이 이런 방식으로 작동한다는 것입니다. 또는 내가 뭔가 잘못하고있다.
나는 봤지만 어떤 해결책도 찾지 못했습니다. 이 중복 질문이나 링크를 감사

를 공유하시기 바랍니다 내 질문과 관련된 답변이 경우 코드입니다 : -

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

groupchat은 XMPP muc (다중 사용자 채팅)로 지정되어 있으므로 특정 그룹에서 보낸 메시지를 수신하려면 muc에 가입해야합니다. 자세한 내용은 https://xmpp.org/extensions/xep-0045.html에서 확인할 수 있습니다.

7.2.1 프로토콜

다중 사용자 채팅 공간에 유지 토론에 참여하기 위해, 사용자 MUST 1.0 Groupchat : 여기

링크에서 발췌 먼저 방에 들어가서 탑승자가됩니다. 이전 groupchat 1.0 프로토콜에서는 에 'type'속성이 없음을 표시하여 수행되었습니다. 여기서 "room"은 방 ID이며 "service"는 채팅 서비스의 호스트 이름이고 "nick"은 방에서 사용자가 원하는 별명 :

+0

문제는 이미 메시지를 받기 위해 이미 가입 한 그룹에 가입해야한다는 것입니다 ... Elsewise 나는 그룹 회원들과 메시지를 교환 할 수 없었습니다 ... –

+0

가입 후 그룹을 탈퇴합니까? 10 초마다 존재감을 보냄으로써 여전히 방의 일부분이 될 수도 있습니다. – manishg

+0

아니요 그룹을 떠나지 않습니다. 그룹의 일부이지만 donot 메시지를 수신합니다 ... 무엇이 잘못 되었습니까 ... –

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) 자동 PubSub를 사용할 수 있습니다, 당신의 groupchats에 가입 기능 처럼 보인다 수있는 헤로인을 가진 조각 :

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

이 코드를 추가 할 때 :

  • 당신에게 그룹 챠트 만들기
  • 당신은 그룹 챠트의 초대를 수락합니다.

은 (그냥 책갈피를 제거하려면 다음

this.bookmarkManager.removeBookmarkedConference(roomName) 

를)

마지막으로 로그인 한 후, groupchat 자동 조인 방법을 추가 : 당신은이 후

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을 추가하는 것을 원하지 않습니다. 그 이유는 프런트 엔드와 함께 receveid 메시지를 동기화하는 데 어려움이 따르기 때문입니다. 그러나 결국 다른 분기가됩니다.

+0

코드를보고 세부 사항에 대한 고마워 친구. 그러나 당신이 공유 한 것은 항상 우리가 만든 방에 합류하는 것입니다 ... 그리고 제 질문은 우리가 이미 회원으로있을 때마다 방에 들어갈 필요가없는 어떤 방법으로도 있습니다. 아니면 유일한 해결책입니까 ??? 감사합니다 .MrPk –

+0

해결 방법.회원 (소유자, 관리자, 회원, 부랑자)이 되려면 (예 : 주제 변경과 같은) 무언가를 할 수있는 권한을 부여하지만 이론적으로 관리자는 기본적으로 소유자로 추가 될 수 있으며 물론 필요하지도 않습니다. 메시지를 수신하십시오. 기본적으로 Time TJ (조인)에서 Time TL (왼쪽)까지의 메시지를받습니다. 다른 구성은 configs입니다. – MrPk

+0

내 이해는 내가 모든 그룹에 가입해야 할 때마다 내가 응용 프로그램을 시작합니다. 그래서 나는 가입하고 떠날 때 그룹들에 대한 메시지를 받기 시작했습니다. –

관련 문제