2013-03-02 70 views
12

对于应用程序,我需要能够创建多用户聊天室并将其加入。聊天服务器是一个openfire服务器。无法用Android的aSmack库创建多用户聊天室(MUC):“packet.DefaultPacketExtension不能转换为包.MUCUser”

我曾经有:

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

当房间不存在,创建房间,并加入。但是下一个用户无法加入。他得到了404,收件人不可用(404)。这表明聊天室被锁定或其他东西。

然后我发现代码的文档中,我试过如下:

chat.create(nickname); 

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

然而,当我尝试执行此它说,它与在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) 

希望有人能帮助我,并提供一些建议。

+0

您是否按照aSmack自述文件告诉您那样正确初始化提供程序? – Flow 2013-03-02 12:18:22

+0

@Flow在创建XMPPConnection和登录? – 2013-03-02 12:22:39

+0

不,我不知道你使用的是aSmack版本还是fork,但是当前的一个自带了一个README – Flow 2013-03-02 12:38:34

回答

12

编辑04/2015:Smack 4.1(或更高版本)不再需要拨打SmackAndroid.init(Context)。实际上SmackAndroid不再存在。

org.jivesoftware.smack.packet.DefaultPacketExtension cannot be cast to org.jivesoftware.smackx.packet.MUCUser通常表示您未初始化aSmack的静态代码,该代码负责为Smack的各种数据包(和数据包扩展)类注册Smack提供程序。

对于大多数aSmack版本,只需调用

SmackAndroid.init(Context ctx) 

会做的伎俩。

+0

简单调用init会在关闭应用程序时给出错误! '12-31 16:30:56.588:E/ActivityThread(14185):活动com.demo.xmpp.XMPPChatDemoActivity泄漏了最初在此处注册的IntentReceiver [email protected]3e6cb08。你是否错过了对unregisterReceiver()的调用? ' – 2013-12-31 11:36:00

+2

'SmackAndroid smack = SmackAndroid.init(context);'。在onDestroy中:'smack.onDestroy()'。 [此链接了解更多详情](https://github.com/Flowdalic/asmack/issues/86)。 – 2014-04-29 10:20:42

+0

@flow你能帮助我smiler问题,我的问题是在这个链接http://stackoverflow.com/questions/25701308/unable-to-create-muc-using-java-smack-from-appservertomcat – Dev 2014-09-06 14:38:39

11

使用此代码..

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(); 
} 

也可手动配置提供经理,你用这种方法在登录之前

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()); 
} 

只是调用这个方法using-配置(ProviderManager.getInstance()) ;

相关问题