4

openfire サーバーと Android クライアント (smack) があります。すべてのクライアントは、バディ/名簿リストにお互いを追加できます (承認なしで、ユーザーはバディ リクエストを受け入れずにお互いを見ることができます)。バディリクエスト送信者のプレゼンス情報を取得する際に問題があります。
ユーザー A、ユーザー B の 2 人のユーザーがいるとします。

次の方法で、ユーザー B をユーザー A の名簿に追加できます。

Roster roster = xmppManager.connection.getRoster();
roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all);
roster.createEntry("userB", "userB@abc.com", null);

ユーザー A の名簿リストにユーザー B が表示されます。これまでのところすべて順調です

ユーザー B にはいくつかの問題があります。以下のコードで何が問題なのかを説明します。

//I have set the available and status of User A by:
//xmppManager.setStatus(available, bundle.getString("new_status"));
...

// That's how I get Roster and Presence of user A
Roster roster = connection.getRoster();

Collection<RosterEntry> entries = roster.getEntries();
for (RosterEntry entry : entries) {


    Presence presence = roster.getPresence(entry.getUser());

    // User A always not available even I set User A to available
    Log.e(TAG, "presence.isAvailable() = " + presence.isAvailable());

    // User A's status always empty
    Log.e(TAG, "presence.getStatus() = " + presence.getStatus());


    // User A's getName() always null
    if (entry.getName() != null)
    {
        name = entry.getName();
    }
    else
        Log.e(TAG, "GetName is null");  

}

ユーザー A で createEntry() を実行する必要がありますか?
それとも、このようなバディリクエストで何かをする必要がありますか?

@Override  
    public void entriesAdded(Collection<String> collection) {
        String user = "";  
        Iterator<String> it = collection.iterator();  
        if(it.hasNext()){  
            user=it.next();  
        }  


        Presence presence = new Presence(Presence.Type.subscribe);   
        presence.setTo(user);   
        connection.sendPacket(presence);  

    }  

しかし、うまくいきません。まずユーザーBに何かをする必要があるようです。どんなアイデアでも大歓迎です、ありがとう!

4

1 に答える 1

2

わかりました、私はこれに数日間懸命に取り組み、ついに物事が機能するようになりました. 手動サブスクリプション モードで実装しました (つまり、ユーザーは別のユーザーの要求を手動で受け入れる必要があります)。送信/受信したプレゼンスに応じてサーバーが自動的に処理するため、自分でエントリを作成する必要はありません。

あなたのケース (自動サブスクリプション) では、リクエストをローカルに保存する代わりに、サブスクライブとサブスクライブされたプレゼンスをすぐに送信するだけです。

これがどのように機能するかです:

  • User1 は、サブスクライブ プレゼンスを User2 に送信します。
  • 名簿エントリは、User1 の名簿に自動的に作成されます (ただし、User2 の名簿には作成されません)。
  • User2 は User1 からサブスクライブ要求を受け取ります。
  • User2 は、サブスクライブしたプレゼンスを User2 に返信します (User2 > User1 のサブスクリプションが完了)。
  • User2 は、User1 が User2 の名簿に含まれているかどうかを確認します。User1 は User2 の名簿にありません。User2 は、サブスクライブ プレゼンスを User1 に送り返します。
  • 名簿エントリは、User2 の名簿に自動的に作成されます。
  • User1 は、User2 からサブスクライブ プレゼンスを受け取ります。
  • User1 は、User2 が User1 の名簿に含まれているかどうかを確認します。User2 は User1 の名簿に含まれています。User1 は、サブスクライブしたプレゼンスを User2 に返信します (User2 > User1 のサブスクリプションが完了)。

            final Presence newPresence = (Presence) packet;
            final Presence.Type presenceType = newPresence.getType();
            final String fromId = newPresence.getFrom();
            final RosterEntry newEntry = getRoster().getEntry(fromId);
    
            if (presenceType == Presence.Type.subscribe)
            {
                //from new user
                if (newEntry == null)
                {
                    //save request locally for later accept/reject
                    //later accept will send back a subscribe & subscribed presence to user with fromId
                    //or accept immediately by sending back subscribe and unsubscribed right now
                }
                //from a user that previously accepted your request
                else
                {
                    //send back subscribed presence to user with fromId
                }
            }
    
于 2014-01-29T09:55:27.380 に答える