3

マルチユーザー チャットのスマック プレゼンス リスナーが呼び出されない。Smack Api を使用してログインし、roster.addRosterListener(mRoasterListener);を追加しました。しかし、チャット ルームの他のユーザーのプレゼンスが変化したときにリッスンすることに成功しませんでした。プレゼンスリスナーを機能させるために、次のコードを試しました:

connection.login(loginUser, passwordUser);

MultiUserChatManager manager = 

MultiUserChatManager.getInstanceFor(connection);

muc = manager.getMultiUserChat(roomID + "@" +context.getString(R.string.group_chat_id));

Log.d("Join User: ", "Already Created");

muc.join(Utilities.getUserPhoneNo(context));

muc.addMessageListener(mGroupMessageListener);

Roster roster = Roster.getInstanceFor(connection);//luna

roster.addRosterListener(mRoasterListener);//roasterListener

Log.d("Joined User Phone: ", " " + Utilities.getUserPhoneNo(context));

そして、プレゼンスの変化をリッスンするこのクラス...

public class RoasterListener implements RosterListener{
        public RoasterListener(Context context){

        }

        @Override
        public void entriesAdded(Collection<String> collection) {

        }

        @Override
        public void entriesUpdated(Collection<String> collection) {

        }

        @Override
        public void entriesDeleted(Collection<String> collection) {

        }

        @Override
        public void presenceChanged(Presence presence) {
            System.out.println("Presence changed: " + presence.getFrom() + " " + presence);
        }
    }

stackoverflow で利用可能な多くのリンクを試しましたが、成功しませんでした。助けてください!

4

3 に答える 3

3

マルチ ユーザー チャットの場合、名簿にない人に会うのは普通のことなので、名簿を使用する必要はありません。

ムクに誰がいるかを知るには、まず占有者を尋ねます。

muc.join(user,password);

List<String> occupantsAtJoinTime = muc.getOccupants();

                    for (String occupant : occupantsAtJoinTime)
                    {
                        System.out.println("occupant: "+occupant);
                        //actions
                    }

次に、Occupants リストを最新の状態に保つために、DefaultParticipantStatusListener を muc に登録し、その Listner を定義します。

muc.addParticipantStatusListener(new CustomParticipantStatusListner());

次のように定義されます (必要に応じて実装するメソッドが多数あります):

    public class CustomParticipantStatusListner extends DefaultParticipantStatusListener 
    {

        public void joined(String participant) 
        {
            System.out.println(participant + "just joined MUC");
//actions (add occupantsRightNow)
        }

        public void left(String participant)
        {
            System.out.println(participant + " just left MUC");
//actions (remove occupantsRightNow)
        }
    }

これはすべてsmack 4.1.7で

于 2016-05-30T11:58:52.820 に答える