gpt4 book ai didi

Android smack 库订阅(不显示入站或出站通知)

转载 作者:行者123 更新时间:2023-11-30 03:34:36 24 4
gpt4 key购买 nike

我正在开发一个 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();
}
}
});

请提出确切的场景。

最佳答案

好的,我为此努力工作了几天,终于可以正常工作了。我已经用手动订阅模式实现了它(即用户需要手动接受另一个用户的请求)。

如果用户没有发回订阅或取消订阅,服务器会不断向用户推送订阅请求(在重新登录时)。因此,您可以做的是将传入的订阅请求本地保存在列表中,并将其显示为手动接受/拒绝的“好友请求列表”。如果您的应用程序重新启动(并因此重新连接到服务器),服务器将再次推送订阅请求。

它是这样工作的:

  • 用户 1 向用户 2 发送订阅状态。
  • 名册条目会在 User1 的名册中自动创建(但不会在 User2 的名册中创建)。
  • 用户 2 收到用户 1 的订阅请求。
  • 用户 2 向用户 2 发回订阅状态(用户 2 > 用户 1 订阅完成)。
  • 用户 2 检查用户 1 是否在用户 2 的花名册中。 User1 不在 User2 的花名册中。用户 2 向用户 1 发回订阅状态。
  • 在 User2 的名册中自动创建名册条目。
  • 用户 1 收到用户 2 的订阅状态。
  • 用户 1 检查用户 2 是否在用户 1 的花名册中。 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
    }
    }

关于Android smack 库订阅(不显示入站或出站通知),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16815531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com