2013-03-02 1 views
12

アプリケーションでは、マルチユーザーチャットルームを作成して参加する必要があります。チャットサーバーはオープンファイアサーバーです。Android用スマートライブラリを使用したマルチユーザーチャット(MUC)ルームを作成できません: "packet.DefaultPacketExtensionはpacket.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

Providersを正しく初期化しましたか?aSmack READMEはあなたに指示しますか? – Flow

+0

@Flow XMPPConnectionを作成してログインするのと同じですか? –

+0

いいえ、スマッシュバージョンやフォークを使用していますが、現在のものはREADMEが添付されています – Flow

答えて

12

編集04/2015:Smack 4.1(またはそれ以上)では、SmackAndroid.init(Context)を呼び出す必要はありません。実際にはSmackAndroidは存在しません。

org.jivesoftware.smack.packet.DefaultPacketExtension cannot be cast to org.jivesoftware.smackx.packet.MUCUserは通常、Smackのさまざまなパケット(およびパケット拡張)クラスのSmackプロバイダの登録を担当するaSmackの静的コードを初期化していないことを示す指標です。最も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()への呼び出しがありませんか? ' –

+2

' SmackAndroid smack = SmackAndroid.init(コンテキスト); '。そして、onDestroy: 'smack.onDestroy()'で。 [詳細はこちらのリンク](https://github.com/Flowdalic/asmack/issues/86)。 –

+0

@flowあなたはsmilerの問題で私を助けることができます私のSOの質問はこのリンクにありますhttp://stackoverflow.com/questions/25701308/unable-to-create-muc-using-java-smack-from-appservertomcat – Dev

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

関連する問題