2013-03-02 7 views
12

Do aplikacji potrzebuję mieć możliwość tworzenia czatu dla wielu użytkowników i dołączenia do niego . Serwer czatu jest serwerem openfire.Nie można utworzyć pokoju czatu dla wielu użytkowników (MUC) z biblioteką aSmack dla Androida: "Pakiet packet.DefaultPacketExtension nie może być przesłany do pakietu.MUCUser"

Kiedyś miałem:

MultiUserChat chat = new MultiUserChat(connection, roomName + "@conference.localhost"); 
chat.join(nickname); 

Gdy pomieszczenie nie istnieje tworzy pokój i przyłącza. jednak następny użytkownik nie może dołączyć. Otrzymuje 404, a odbiorca niedostępny (404). Co sugeruje, że czat jest zablokowany lub coś takiego.

Potem znalazłem kod w dokumentacji i próbowałem następujące:

chat.create(nickname); 

// Send an empty room configuration form which indicates that we want 
// an instant room 
chat.sendConfigurationForm(new Form(Form.TYPE_SUBMIT)); 

Jednak gdy próbuję wykonać ten mówi, że zawiesza z powodu następującego błędu w LogCat:

03-02 12:04:12.890: E/AndroidRuntime(20872): FATAL EXCEPTION: 

AsyncTask #3 03-02 12:04:12.890: E/AndroidRuntime(20872): 

java.lang.RuntimeException: An error occured while executing 
doInBackground() 
03-02 12:04:12.890: E/AndroidRuntime(20872): Caused 
by: java.lang.ClassCastException: 

org.jivesoftware.smack.packet.DefaultPacketExtension cannot be cast to 
org.jivesoftware.smackx.packet.MUCUser 03-02 12:04:12.890: 
E/AndroidRuntime(20872): at 
org.jivesoftware.smackx.muc.MultiUserChat.getMUCUserExtension(MultiUserChat.java:2002) 
03-02 12:04:12.890: E/AndroidRuntime(20872): at 
org.jivesoftware.smackx.muc.MultiUserChat.create(MultiUserChat.java:364) 
03-02 12:04:12.890: E/AndroidRuntime(20872): at 
be.xios.crs.pivi.managers.XmppManager.createOrJoinChatGroup(XmppManager.java:116) 

Mam nadzieję, że ktoś może mi w tym pomóc i udzielić porady.

+0

Czy poprawnie zainicjowano dostawców, o czym informuje program aSmack README? – Flow

+0

@Flow Podobnie jak w przypadku tworzenia połączenia XMPPC i logowania? –

+0

Nie, nie wiem z wersją aMack lub widelcem, którego używasz, ale obecny jest z README – Flow

Odpowiedz

12

Edytuj 04/2015: Dzwonienie pod numer SmackAndroid.init(Context) nie jest już wymagane w wersji 4.1 (lub wyższej). W rzeczywistości SmackAndroid już nie istnieje.

jest zwykle wskaźnikiem, że nie zainicjowano statycznego kodu aSmack, który zajmuje się rejestracją dostawców Smack dla różnych klas pakietu (i rozszerzenia pakietu) Smack.

Dla większości wersji aSmack, po prostu dzwoniąc

SmackAndroid.init(Context ctx) 

rade.

+0

proste wywoływanie init dają błędy podczas zamykania aplikacji! '12-31 16: 30: 56.588: E/ActivityThread (14185): Aktywność com.demo.xmpp.XMPPChatDemoActivity wyciekła IntentReceiver [email protected]3e6cb08, która została oryginalnie zarejestrowana tutaj. Czy brakuje połączenia z wyrejestrowaniemReceiver()? ' –

+2

' SmackAndroid smack = SmackAndroid.init (kontekst); '. I w onDestroy: 'smack.onDestroy()'. [Ten link po więcej szczegółów] (https://github.com/Flowdalic/asmack/issues/86). –

+0

@flow Czy możesz mi pomóc z problemem smilera, moje pytanie SO jest pod tym linkiem http://stackoverflow.com/questions/25701308/unable-to-create-muc-using-java-smack-from-appservertomcat – Dev

11

użyć tego kodu ..

MultiUserChat muc = new MultiUserChat(connection, "[email protected]<server>"); 
muc.create("nickname1"); 

Form form = muc.getConfigurationForm(); 
Form submitForm = form.createAnswerForm(); 
for (Iterator fields = form.getFields();fields.hasNext();){ 
    FormField field = (FormField) fields.next(); 
    if(!FormField.TYPE_HIDDEN.equals(field.getType()) && field.getVariable()!= null){ 
     submitForm.setDefaultAnswer(field.getVariable()); 
    } 
}    
submitForm.setAnswer("muc#roomconfig_publicroom", true); 
muc.sendConfigurationForm(submitForm); 
muc.join("nickname1"); 
}catch (Exception e) { 
    e.printStackTrace(); 
} 

również skonfigurować menedżera Provider ręcznie przed zalogowaniem się przy użyciu tej metody

public void configure(ProviderManager pm) { 

    // Private Data Storage 
    pm.addIQProvider("query","jabber:iq:private", new PrivateDataManager.PrivateDataIQProvider()); 

    // Time 
    try { 
     pm.addIQProvider("query","jabber:iq:time", Class.forName("org.jivesoftware.smackx.packet.Time")); 
    } catch (ClassNotFoundException e) { 
     Log.w("TestClient", "Can't load class for org.jivesoftware.smackx.packet.Time"); 
    } 

    // Roster Exchange 
    pm.addExtensionProvider("x","jabber:x:roster", new RosterExchangeProvider()); 

    // Message Events 
    pm.addExtensionProvider("x","jabber:x:event", new MessageEventProvider()); 

    // Chat State 
    pm.addExtensionProvider("active","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider()); 
    pm.addExtensionProvider("composing","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider()); 
    pm.addExtensionProvider("paused","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider()); 
    pm.addExtensionProvider("inactive","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider()); 
    pm.addExtensionProvider("gone","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider()); 

    // XHTML 
    pm.addExtensionProvider("html","http://jabber.org/protocol/xhtml-im", new XHTMLExtensionProvider()); 

    // Group Chat Invitations 
    pm.addExtensionProvider("x","jabber:x:conference", new GroupChatInvitation.Provider()); 

    // Service Discovery # Items  
    pm.addIQProvider("query","http://jabber.org/protocol/disco#items", new DiscoverItemsProvider()); 

    // Service Discovery # Info 
    pm.addIQProvider("query","http://jabber.org/protocol/disco#info", new DiscoverInfoProvider()); 

    // Data Forms 
    pm.addExtensionProvider("x","jabber:x:data", new DataFormProvider()); 

    // MUC User 
    pm.addExtensionProvider("x","http://jabber.org/protocol/muc#user", new MUCUserProvider()); 

    // MUC Admin  
    pm.addIQProvider("query","http://jabber.org/protocol/muc#admin", new MUCAdminProvider()); 

    // MUC Owner  
    pm.addIQProvider("query","http://jabber.org/protocol/muc#owner", new MUCOwnerProvider()); 

    // Delayed Delivery 
    pm.addExtensionProvider("x","jabber:x:delay", new DelayInformationProvider()); 

    // Version 
    try { 
     pm.addIQProvider("query","jabber:iq:version", Class.forName("org.jivesoftware.smackx.packet.Version")); 
    } catch (ClassNotFoundException e) { 
     // Not sure what's happening here. 
    } 

    // VCard 
    pm.addIQProvider("vCard","vcard-temp", new VCardProvider()); 

    // Offline Message Requests 
    pm.addIQProvider("offline","http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider()); 

    // Offline Message Indicator 
    pm.addExtensionProvider("offline","http://jabber.org/protocol/offline", new OfflineMessageInfo.Provider()); 

    // Last Activity 
    pm.addIQProvider("query","jabber:iq:last", new LastActivity.Provider()); 

    // User Search 
    pm.addIQProvider("query","jabber:iq:search", new UserSearch.Provider()); 

    // SharedGroupsInfo 
    pm.addIQProvider("sharedgroup","http://www.jivesoftware.org/protocol/sharedgroup", new SharedGroupsInfo.Provider()); 

    // JEP-33: Extended Stanza Addressing 
    pm.addExtensionProvider("addresses","http://jabber.org/protocol/address", new MultipleAddressesProvider()); 

    // FileTransfer 
    pm.addIQProvider("si","http://jabber.org/protocol/si", new StreamInitiationProvider()); 

    pm.addIQProvider("query","http://jabber.org/protocol/bytestreams", new BytestreamsProvider()); 

    // Privacy 
    pm.addIQProvider("query","jabber:iq:privacy", new PrivacyProvider()); 
    pm.addIQProvider("command", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider()); 
    pm.addExtensionProvider("malformed-action", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.MalformedActionError()); 
    pm.addExtensionProvider("bad-locale", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadLocaleError()); 
    pm.addExtensionProvider("bad-payload", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadPayloadError()); 
    pm.addExtensionProvider("bad-sessionid", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadSessionIDError()); 
    pm.addExtensionProvider("session-expired", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.SessionExpiredError()); 
} 

zadzwoń ta metoda using- configure (ProviderManager.getInstance()) ;