3

何時間にもわたるデバッグと、aSmack を使用してファイル転送が機能しない理由を見つけようとした後、通常のメッセージングは​​機能していましたが、最終的にこれに突き止めることができました。

Openfire サーバーは、ユーザーの名簿リストを取得するために Smack のドキュメントに記載されている方法に従っているときに、最後に / がない名簿の JID を送信しています。

Collection<RosterEntry> entries = roster.getEntries();
for (RosterEntry r : entries) {
    Log.v("Gabriel","Receiving: " + r.getUser());
}      

たとえば、ユーザー gabriel からメッセージを受信した場合、"差出人" は次のようになります。

gabriel@dragonov/Smack

しかし、r.getUser() はユーザーに次のように返します。

gabriel@dragonov

connection.getRoster().getPresence(contactName).getFrom()

帰ってきたのは「gabriel@dragonov」です。

これにより、ファイル転送が失敗しますが、奇妙なことに通常のメッセージではありません。ただし、 /Smack の最後に手動で追加すると

 OutgoingFileTransfer transferr = manager.createOutgoingFileTransfer(contactJID+"/Smack");

できます。

私の質問は、リソース部分が含まれている完全な JID を受け取る方法、または裸の JID を使用するときに失敗しないようにファイル転送を構成するにはどうすればよいかということです。


編集:

私は次の方法を試しました:

 Log.v("Gabriel", entries.size() + " buddy(ies):");
    for (RosterEntry r : entries) {
        Log.v("Pat","adding: " + r.getType() + "  " + r.getName());
        contacts.add(r.getUser());
    }      

    for (String contact : contacts){
        Iterator<org.jivesoftware.smack.packet.Presence> presences = connection.getRoster().getPresences(contact);
        Log.v("Gabriel", contact+" has: ");
        while(presences.hasNext()){
            Log.v("Gabriel",presences.next().getFrom());
        }           
    }

しかし、私はまだ裸のIDを取得しています。

出力: gabriel@dragonov には: gabriel@dragonov があります。

4

1 に答える 1

0

Iterator<Presence> Roster.getPresences(String user)ユーザーのすべての既知のリソースからプレゼンス情報を取得するために使用します。この Presence インスタンスgetFrom()では、 で使用できる完全な JID を返す必要がありますFileTransferManager.createOutgoingFileTransfer()

での完全な JID の使用に関して、SMACK-430を作成しましたcreateOutgoingFileTranfer()。これは本当に例外をスローする必要があるため、ユーザーは理由を見つけるために何時間もデバッグする必要がありません (ただし、メソッド javadoc には記載されています)。SMACK-430 は、FileTransferManager が完全な JID を必要とし、裸の JID では使用できない理由についても説明しています。

于 2013-03-20T10:27:02.990 に答える