4

こんにちは皆さん、私はアンドロイドが初めてで、現在これにこだわっています。xmpp サーバーで作成されたパブリック ルームのリストを返す必要があります。私が抱えている問題は、以下のコードが Java では正常に機能することですが、Android の場合は null ポインター例外があります。これに関するヘルプをいただければ幸いです。

私は openfire サーバーを使用してローカル マシンでテストしているため、ドメイン名の代わりに IP アドレスを使用しています。

私はJAVA用のsmackライブラリとAndroid用のAsmack Libraryを使用しています

String server_name = "192.168.3.113";
    ConnectionConfiguration config = new ConnectionConfiguration(
            server_name, 5222);
    XMPPConnection connection = new XMPPConnection(config);
    try {
        connection.connect();

        connection.login("s1", "123");

        Collection<HostedRoom> rooms = MultiUserChat.getHostedRooms(
                connection, "conference.geekoid");
        for (HostedRoom room : rooms) {
            System.out.println(room.getName());
        }

    } catch (XMPPException e) {
        System.out.println("Error" + e.getMessage() + "\n"); //for JAVA
                    log.e("Android Error",e.getmessage());  // For Android
    }
4

2 に答える 2

6

問題の解決策を見つけました。

Android asmack ライブラリは getHostedRooms(Connection connection, String serviceName)メソッドでこれを使用していました

ServiceDiscoveryManager discoManager =ServiceDiscoveryManager.getInstanceFor(connection);

私はそれを

ServiceDiscoveryManager discoManager = new ServiceDiscoveryManager(connection);

この方法がどこにあるのか混乱している人のために

パッケージ: org.jivesoftware.smackx.muc

ファイル: MultiUserChat.java

これを行った後。Android にすべてのプロバイダーを登録する必要があります。その詳細については、こちらを参照してください。これらのプロバイダーは、JAVA の smack ライブラリ (Java 開発の場合) を使用すると自動的に登録されますが、Android では自分で登録する必要があります。

于 2012-07-26T07:16:13.630 に答える
6

問題は、接続を作成する前にServiceDiscoveryManager クラスの静的ブロックを評価する必要があることです。Smack では、これは構成ファイルを介して行われますが、このアプローチは Android では機能しないため、aSmack では機能しません。

コンストラクターを使用して SDM オブジェクトを取得したくないので、代わりに get() メソッドを使用する必要があるため、回答に記載されている回避策はやや醜いです。ただし、get() メソッドは、接続用に作成された SDM が実際に存在する場合にのみ機能します。

そのため、Android で SDM を正しく初期化するには、最初の (XMPP)Connection オブジェクトを作成する前に、完全な forName 表記を呼び出してクラスの静的ブロックを初期化する必要があります。

Class.forName("org.jivesoftware.smackx.ServiceDiscoveryManager", true, ClassLoader.getSystemClassLoader()):

これはaSmack Issue 8として追跡されます

于 2012-07-24T15:24:28.543 に答える