【问题标题】:Android smack library subscription(not showing inbond or outbond notifications)Android smack 库订阅(不显示入站或出站通知)
【发布时间】:2013-05-24 19:26:56
【问题描述】:

我正在开发一个 android 聊天应用程序,我在其中使用 smack 库进行即时消息传递,一切正常,但最大的问题在于订阅。

如何向其他用户发送订阅通知。

这是我发送订阅请求的代码:

public void run() {
        /*runOnUiThread(new Runnable() {
            public void run() {*/
                Roster roster = XMPPSmackConnection.getInstance().connection.getRoster();
                roster.setSubscriptionMode(Roster.SubscriptionMode.manual);
                try {
                    if(!_userName.contains("@"))
                        _userName=_userName+"@www.naijapings.net";

                    /*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");
                    XMPPSmackConnection.getInstance().connection.sendPacket(presence_request);
                    roster.createEntry(presence.getFrom(), null, null);*/

                    /*Presence response = new Presence(Presence.Type.subscribe);
                    response.setTo(_userName);
                    XMPPSmackConnection.getInstance().connection.sendPacket(response);*/

                    //PROCESS TWO WAY COMMUNICATION
                    Presence response1 = new Presence(Presence.Type.subscribe);
                    response1.setTo(_userName);
                    XMPPSmackConnection.getInstance().connection.sendPacket(response1);
                    //////////////////////////////////////////////////////

                    //roster.createEntry(_userName, null, null);

                    /*roster.createEntry(_userName, _nickName, Friends);*/
                    //roster.createEntry(_tempUserName, null, null);
                    //roster.createEntry(_userName, _nickName, my_friends[]);
                    //addBuddy(_userName, _nickName, Friends);
                } catch (Exception e) {
                    _progDailog.dismiss();
                    e.printStackTrace();
                }
                _progDailog.dismiss();
                successAlert("Buddy requested successfully");
            /*}
        });*/

以上代码只在其他用户的花名册列表中创建花名册条目,但不显示订阅通知。

这是接受订阅请求的代码:

runOnUiThread(new Runnable() {
                public void run() {
                    try {
                        Roster roster = XMPPSmackConnection.getInstance().connection.getRoster();
                        ///roster.setSubscriptionMode(Roster.SubscriptionMode.manual);
                        //Presence presence = roster.getPresence(_buddyUserName);
                        roster.setSubscriptionMode(Roster.SubscriptionMode.manual);
                        //Presence subscribed = new Presence(Presence.Type.subscribed);

                        Presence response = new Presence(Presence.Type.subscribed);
                        response.setTo(_buddyUserName);
                        XMPPSmackConnection.getInstance().connection.sendPacket(response);

                        /*response = new Presence(Presence.Type.subscribed);
                        response.setTo(_buddyUserName);
                        XMPPSmackConnection.getInstance().connection.sendPacket(response);*/

                        roster.createEntry(_buddyUserName, _nickNameEditText.getText().toString(), Friends);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

请提出确切的方案。

【问题讨论】:

  • 大家好,有什么解决办法吗?

标签: android smack asmack


【解决方案1】:

你不能这样发送订阅,这样做:

 Presence subscription = new Presence(
               Presence.Type.subscribe);
       subscription.setTo(CurrentUser+"@reza-hp");
       subscription.setPriority(24);
       newp.setMode(Presence.Mode.available);
       connection.sendPacket(subscription);

【讨论】:

    【解决方案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 的名单中。用户 1 向用户 2 发回订阅状态(用户 2 > 用户 1 订阅完成)。

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

    【讨论】:

      【解决方案3】:

      为了接收订阅请求,您必须:

      1) 发送出席信息:

      <presence/>
      

      2) 检索名册:

      <iq type='get' id='roster1'>
        <query xmlns='jabber:iq:roster'/>
      </iq>
      

      第一次写客户的人往往会对第二次写的人感到惊讶。

      【讨论】:

      • 感谢乔的回复,但如果我在某处错了,我也会这样做,请告诉我。
      猜你喜欢
      • 2022-08-08
      • 2020-01-12
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 2016-12-19
      相关资源
      最近更新 更多