1

私のアプリケーションでは、友達を追加する必要がある場合、通常、サブスクリプションパケットを4回送信します。

A-> B(サブスクライブ)B-> A(サブスクライブ)BA(サブスクライブ)A-> B(サブスクライブ)

各ステップの後、サーバー上でステータスがすぐに変わります。

しかし、私のアプリケーションでは、ログアウトしてから再度ログインした後にのみ反映されます。友達を追加した後、その人は一度ログアウトする必要があります。その後、友達だけが友達リストに表示されます>

どうしたの?私はたくさん見つけましたが、エラーは見つかりませんでした:(

logcatにエラーは表示されていません。

また、各パケットが送信された後にsyso出力を出力しました。常にNONE(リクエストの送信先の人の場合)と表示され、常にTO / FROM(友達リクエストを送信したユーザーの場合)と表示されます。両方とも、ログに記録されない限り反映されません。ログアウトして再度ログインします。

私を助けてください :(

Add Friend Function

public boolean addFriend(String jid) {
        String nickname = null;
        String idExtension = jid+"@abc.hostname.com";
        nickname = StringUtils.parseBareAddress(jid);
        if (!roster.contains(idExtension)) {
            try {   
                roster.createEntry(idExtension, nickname, null);
                //to subscribe the user in the entry
                Presence subscribe = new Presence(Presence.Type.subscribe);
                subscribe.setTo(idExtension);               
                connection.sendPacket(subscribe);   
                return true;

            } catch (XMPPException e) {
                System.err.println("Error in adding friend");
                return false;
            }
        } else {
            return false;
        }
    }

他のユーザーに通知を送信します。このコードの記述を許可すると:-

btn_Allow = (Button)findViewById(R.id.btn_manageNotification_ALLOW);
        btn_Allow.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub

                //accept the friends subscription
                Presence subscribed = new Presence(Presence.Type.subscribed);
                subscribed.setTo(id);               
                connection.sendPacket(subscribed);



                mCustomProgressDialog = CustomProgressDialog.createDialog(
                        ManageNotification.this, "", "");
                mCustomProgressDialog.show();   
                mCustomProgressDialog.setCancelable(false); 
                new Thread(){
                    public void run() {

                        try {
                            sleep(5000);
                            //mXmconn.getContactList();

                            /*Presence subscribed = new Presence(Presence.Type.subscribe);
                            subscribed.setTo(id);               
                            System.out.println("The user is :"+id);
                            connection.sendPacket(subscribed);*/

                        } catch (InterruptedException e) {}                     
                        mReturnUserMenu.sendEmptyMessage(0);

                    };
                }.start();
            }
        });

リクエストを開始したユーザーに対して、許可時に再度実行されます。

助けてください。サブスクリプションステータスはサーバーでは即座に変更されますが、アプリでは一度ログアウトすると更新されます。

これがリストを表すコードです

public  void getContactList(){

        roster = connection.getRoster();

        Collection<RosterEntry> entries = roster.getEntries();
        System.out.println("Total=="+entries.size());
        mfriendList.clear();
        mfriendPendingList.clear();
        mfriendRequestList.clear();
        for (RosterEntry entry : entries) {
            mFriendsDataClass = new FriendsDataClass();

            mFriendsDataClass.friendName = entry.getUser().toString();

            String user = entry.getUser();

            int index_of_Alpha = user.indexOf("@");
            /*System.out.println("The current working user is : "+user);
            System.out.println("His status is"+entry.getType().toString());*/
            String subID = user.substring(0, index_of_Alpha);
            Presence availability = roster.getPresence(user);
            Mode userMode = availability.getMode();

            mFriendsDataClass.availability = "";
            mFriendsDataClass.friendNickName = subID;           
            mFriendsDataClass.friendStatus = stusMsg.toString();
            mFriendsDataClass.friendState = retrieveState_mode(availability.getMode(),availability.isAvailable());
            if(entry.getType().toString().equalsIgnoreCase("to")){
                //getContactList();
                mfriendRequestList.add(mFriendsDataClass);
            }else if(entry.getType().toString().equalsIgnoreCase("from")){
                //getContactList();
                mfriendPendingList.add(mFriendsDataClass);
            }else if(entry.getType().toString().equalsIgnoreCase("both")){
                //getContactList();
                mfriendList.add(mFriendsDataClass);
            }           
        }
    }

ありがとう

4

1 に答える 1

2

リクエストを送信するには、以下を使用する必要があります。

roster.createEntry("mail_id", null, null);

またListening、リクエストの場合は、を使用してリッスンする必要がありますPacketListener。そして、Presence

Presence presence = (Presence) packet;
Presence presence_request = new Presence(Presence.Type.subscribed);
presence_request.setTo(presence.getFrom());
presence_request.setType(Presence.Type.subscribed);
presence_request.setFrom("current_logged_in_user");
connection.sendPacket(presence_request);
roster.createEntry(presence.getFrom(), null, null);
于 2012-11-12T12:12:53.020 に答える