android - 注销以在 xmpp smack 中添加好友

标签 android xmpp subscription

在我的应用程序中,当我必须添加 friend 时,我通常会发送 4 次订阅数据包 即

A->B(订阅) B->A(已订阅) B-A(订阅) A->B(已订阅)

在每一步之后,我都会在服务器上看到状态立即发生变化。

但在我的应用程序中,它仅在注销并再次登录后才会反射(reflect)出来。 此人在添加好友后必须注销一次,然后好友列表中才会显示该好友>

有什么问题?我找了很多但没有发现任何错误:(

logcat 中没有显示错误。

我还打印了每个数据包发送后的 syso 输出。它总是说 NONE(对于发送请求的人)并且总是说 TO/FROM(对于发送好友请求的用户)。直到并且除非有人登录,否则两者都不会反射(reflect)出来退出并重新登录。

请帮帮我:(

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);
            }           
        }
    }

谢谢

最佳答案

发送一个你必须使用的请求,

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);

关于android - 注销以在 xmpp smack 中添加好友,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13338515/

相关文章:

ios - 如果我在聊天应用程序(WhatsApp 之类的应用程序)中使用 VOIP 功能,Apple 会拒绝我的应用程序吗

android - 如何使用 smack 4.1 向 xmpp 服务器发送信息查询包?

php - Facebook 订阅 API - 页面评论的推送通知?

android - 我是否正确执行了这些步骤来检查用户的应用内结算订阅?

java - 如何让ImageView为空后重新出现

android - 在Android中,File.renameTo会覆盖目标文件吗?

php - 如何使用XMPP和BOSH实现facebook聊天

javascript - 如果已经使用相同的请求运行,则取消订阅/取消 Angular 4 中的现有 HTTP/XHR 调用

java - 设置代理?

android:在 api 级别 14 之前使用 Gravity.Start 或 Gravity.End