2015-11-26 41 views
6

我在Android中實現了一個Group Chat機制,我已經創建了組並通過Openfire的REST API插件添加成員。將消息發送到同一組而不將消息傳遞給同一組的所有成員。請看我的錯誤日誌相同,並建議我任何解決方案相同。XMPP Group Chat Android

登錄:

11-26 17:51:42.364 10035-10035/com.myoneapp.chat V/Cursor data==>>﹕ To User ID==> onCreateLoader=>terehokerahenge 
11-26 17:51:47.018 10035-10654/com.myoneapp.chat I/System.out﹕ 05:51:47 PM SENT (0): <message to='[email protected]' id='362-05' type='groupchat'><body>hi</body><SenderName></SenderName><mediaType>0</mediaType><request xmlns='urn:xmpp:receipts'/></message> 
11-26 17:51:47.066 10035-10035/com.myoneapp.chat V/ChatWindow﹕ MESSAGE TYPE==>0 
11-26 17:51:47.070 10035-10035/com.myoneapp.chat V/ChatWindow﹕ MESSAGE TYPE==>0 
11-26 17:51:47.072 10035-10035/com.myoneapp.chat V/ChatWindow﹕ MESSAGE TYPE==>0 
11-26 17:51:48.097 10035-10655/com.myoneapp.chat I/System.out﹕ 05:51:48 PM RECV (0): <message to="[email protected]/chat.spectratech.in" id="362-05" type="error" from="[email protected]"><body>hi</body><SenderName/><mediaType>0</mediaType><request xmlns="urn:xmpp:receipts"/><error code="406" type="modify"><not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></message> 
11-26 17:51:48.102 10035-10654/com.myoneapp.chat I/System.out﹕ 05:51:48 PM SENT (0): <message to='[email protected]' id='CGIln-9' type='error'><received xmlns='urn:xmpp:receipts' id='362-05'/></message> 

代碼:

new Thread(new Runnable() { 
       @Override 
       public void run() { 
        activity.getmService().xmpp.createMUCGroup(etGroupSubject.getText().toString(), mAppPreferences.getUserName()); 

        getActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          activity.getmService().xmpp.inViteUserstoGroup(jabberids); 
         } 
        }); 
       } 
      }).start(); 

public void createMUCGroup(String gJID, String owner){ 
     mMultiUserChat = getMUChatManager().getMultiUserChat(gJID + "@conference.chat.spectratech.in"); 
     try { 
      mMultiUserChat.create(mAppPreferences.getUserName()); 

// Get the the room's configuration form 
      // org.jivesoftware.smackx.xdata.Form form = mMultiUserChat.getConfigurationForm(); 
// Create a new form to submit based on the original form 


      org.jivesoftware.smackx.xdata.Form form = mMultiUserChat.getConfigurationForm().createAnswerForm(); 
      form.setAnswer("muc#roomconfig_publicroom", true); 
      form.setAnswer("muc#roomconfig_roomname", gJID); 
      form.setAnswer("muc#roomconfig_roomowners",gJID); 
      form.setAnswer("muc#roomconfig_persistentroom", true); 

      mMultiUserChat.sendConfigurationForm(form); 
      /*org.jivesoftware.smackx.xdata.Form submitForm = form.createAnswerForm(); 
// Add default answers to the form to submit 
      for (java.util.Iterator fields = (java.util.Iterator) form.getFields(); fields.hasNext();) { 
       org.jivesoftware.smackx.xdata.FormField field = (org.jivesoftware.smackx.xdata.FormField) fields.next(); 
       if (!org.jivesoftware.smackx.xdata.FormField.Type.hidden.equals(field.getType()) && field.getVariable() != null) { 
        // Sets the default value as the answer 
        submitForm.setDefaultAnswer(field.getVariable()); 
       } 
      }*/ 
// Sets the new owner of the room 
      /*java.util.List owners = new java.util.ArrayList(); 
      owners.add(mAppPreferences.getUserName()+"@chat.spectratech.in"); 
      submitForm.setAnswer("muc#roomconfig_roomowners", owners); 
// Send the completed form (with default values) to the server to configure the room 
      mMultiUserChat.sendConfigurationForm(submitForm);*/ 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

public void inViteUserstoGroup(java.util.ArrayList<String> users){ 
     getMUChatManager().addInvitationListener(MyXMPP.this); 
     for (int i = 0; i < users.size(); i++) { 
      try { 
       mMultiUserChat.invite(users.get(i)+"@chat.spectratech.in", "Meet me in this group."); 
      } catch (org.jivesoftware.smack.SmackException.NotConnectedException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

@Override 
    public void invitationReceived(org.jivesoftware.smack.XMPPConnection xmppConnection, org.jivesoftware.smackx.muc.MultiUserChat multiUserChat, String s, String s1, String s2, org.jivesoftware.smack.packet.Message message) { 
     try { 
      System.out.println("Invitation Received==========================>"); 
      mMultiUserChat.join(s1); 
     } catch (org.jivesoftware.smack.SmackException.NoResponseException e) { 
      e.printStackTrace(); 
     } catch (org.jivesoftware.smack.XMPPException.XMPPErrorException e) { 
      e.printStackTrace(); 
     } catch (org.jivesoftware.smack.SmackException.NotConnectedException e) { 
      e.printStackTrace(); 
     } 
    } 

它返回錯誤406,不接受

回答

6

我認爲你缺少自動接受羣聊在你的代碼加入請求的執行。

下面的代碼使用的Openfire服務器

1.工作AMACK羣聊創建XMPP連接

XMPPTCPConnection connection = new XMPPTCPConnection(config); 
    connection.connect(); 
    connection.login(ID1, password1); 
    Presence presence = new Presence(Presence.Type.available); 
    connection.sendPacket(presence); 

2.創建持久羣聊室

MultiUserChat chatRoom = new MultiUserChat(connection, "[email protected]"); 
    chatRoom.create("nagarjuna"); 
    Form form = chatRoom.getConfigurationForm().createAnswerForm(); 
    form.setAnswer("muc#roomconfig_publicroom", true); 
    form.setAnswer("muc#roomconfig_roomname", "room786"); 
    form.setAnswer("muc#roomconfig_roomowners",owners); 
    form.setAnswer("muc#roomconfig_persistentroom", true); 
    chatRoom.sendConfigurationForm(form); 

3.發送邀請與會者參加

MultiUserChat.addInvitationListener(connection, groupChatListener); 
    chatRoom.invite("[email protected]", "hi surya"); 

4.自動接受騎師要求加入羣組聊天

public class GroupChatListener implements InvitationListener{ 
    String nickname; 

    public GroupChatListener(String nick) 
    { 
     nickname = nick; 
    } 

    @Override 
    public void invitationReceived(XMPPConnection con, String room,String inviter, String reason, String password, Message message) 
    { 
     System.out.println(" Entered invitation handler... "); 
     try 
     { 
      MultiUserChat chatRoom = new MultiUserChat(con, room); 
      chatRoom.join(nickname); 
     } 
     catch (NoResponseException | XMPPErrorException| NotConnectedException e) 
     { 
      e.printStackTrace(); 
     } catch (SmackException e) 
     { 
      e.printStackTrace(); 
     } 
     System.out.println(" Invitation Accepted... "); 
    } 

} 

5.發送消息給羣聊成員

private static void sendMessageToRoomOccupants(XMPPTCPConnection connection) throws NotConnectedException 
{ 
    Message msg = new Message("[email protected]",Message.Type.groupchat); 
    msg.setBody("This is nagarjuna friednds. Please join this room and let us have fun."); connection.sendPacket(msg); 
} 

6.接收乘坐用戶羣聊消息

MultiUserChat chatRoom = new MultiUserChat(connection, "[email protected]"); 
chatRoom.addMessageListener(new GroupChatMsgListener()); 

package com.disha.test; 
import org.jivesoftware.smack.PacketListener; 
import org.jivesoftware.smack.SmackException.NotConnectedException; 
import org.jivesoftware.smack.packet.Packet; 

public class GroupChatMsgListener implements PacketListener 
{ 

    @Override 
    public void processPacket(Packet packet) throws NotConnectedException 
    { 
     System.out.println(" Received group cht messages... "); 
     System.out.println("from : "+packet.getFrom()); 
     System.out.println("to : "+packet.getTo()); 
     System.out.println(packet.toString()); 
    } 
} 
+0

嗨Mayur,感謝您的幫助,但我已經嘗試了這些代碼在我的應用程序,但仍然無法正常工作。我編輯了我的問題,請檢查我的代碼,並告訴我我哪裏出錯了。 –

+0

我也遵循你提到的代碼中的相同鏈接,https://sites.google.com/site/nextthoughtlabs/engineering/group-chat-using-smack-with-openfire-xmpp-server –

+0

在你的代碼中,你使用已創建組的MUC對象加入addInvitationListener。這是錯誤的。請使用新創建的MultiUserChat對象,如第4步中定義的inviteReceived函數 –

0

爲了在您需要的小組聊天消息發送先加入它:

mMultiUserChat.join("yournickname"); 
+0

我已經實現了同樣的功能。請在我的代碼中提出任何錯誤。 –

+0

在您的代碼中,我只在邀請接收時看到「加入」呼叫。邀請發件人也必須加入 – vitalyster

0

其在4.1.9版本不工作,你可以試試這個:

public MultiUserChat mMultiUserChat; 
    private MultiUserChatManager mMultiUserChatManager; 

    mMultiUserChatManager = MultiUserChatManager.getInstanceFor(mAbstractXMPPConnection); 
    mMultiUserChatManager.addInvitationListener(this); 

    mMultiUserChat = mMultiUserChatManager.getMultiUserChat(room); 
    mMultiUserChat.addMessageListener(this); 

    try { 
     mMultiUserChat.join(yournickname); 

     // mMultiUserChat.sendConfigurationForm(new Form(DataForm.Type.submit)); 

    } catch (SmackException.NoResponseException e) { 
     e.printStackTrace(); 
    } catch (XMPPException.XMPPErrorException e) { 
     e.printStackTrace(); 
    } catch (SmackException.NotConnectedException e) { 
     e.printStackTrace(); 
    } 

併發送消息:

 Message msg = new Message(room, Message.Type.groupchat); 
    msg.setBody(message); 
    mMultiUserChat.sendMessage(msg); 

希望這是有益的,謝謝。