标签: smack

通过使用smack,openfire无法获得名单

我是新来的粉碎API.我正在尝试开发一个聊天应用程序,我正在尝试设置和获取存在.

当我改变用户的存在时,它的工作完全正常并且它会在Openfire服务器中反映出来.

但是当我试图获得用户的存在时,即使他在openfire中的存在显示为"可用",我也总是将状态设置为"不可用".

我使用以下代码来设置状态.

        Presence presence = new Presence(Presence.Type.available);
        presence.setStatus("Online, Programmatically!");
        presence.setPriority(24);
        presence.setMode(Presence.Mode.available);
        user.getConnection().sendPacket(presence);
Run Code Online (Sandbox Code Playgroud)

我正在使用Roster类来获得如下存在.

Roster roster = avatar.getRoster();
Collection<RosterEntry> entries = roster.getEntries();

for(RosterEntry rosterEntry: entries) {
    String user = rosterEntry.getUser();

    Presence presence = roster.getPresence(user);

    System.out.println("Presence : "+presence);                                     // 1
    System.out.println("Presence type: "+presence.getType());                // 2
    System.out.println("Presence mode: "+presence.getMode());             // 3

}
Run Code Online (Sandbox Code Playgroud)

第1行alwasys给出'不可用',第2行和第3行总是给出null

我无法弄清楚这个问题的原因.请帮我解决这个问题.

提前致谢.

openfire smack

6
推荐指数
2
解决办法
1万
查看次数

打击 - 创建名册中的条目

我知道之前已经问过这个问题,但mschonaker 在这里只给出了部分回复.在我的网站上,用户可以将人员添加到他们的名单中,然后伙伴必须接受并最终连接.第一个人(用户a)使用着名的

roster.createEntry(jid, name, groups);

在他的名单中工作并添加一个条目,但后来我对该怎么做有点困惑:

  • 我如何在另一端收到请求?我尝试实现PacketListener,覆盖processPacket()并检查数据包的类型是Presence.Type.subscribe或Presence.Type.subscribed,但它似乎只为用户a触发,但不是应该监听的用户a订阅用户b.

  • 然后,我有另一个函数,可以在登录时查找所有请求,所以如果我再次登录,我会看到请求,但我如何接受它?起初,我认为用户b也应该在他的名单中添加用户a roster.createEntry(jid, name, groups);

但这没有用,也没有发生任何事情.我也试过

Presence subscribed = new Presence(Presence.Type.subscribed);
subscribed.setTo(jid);
xMPPConnection.sendPacket(subscribed);
Run Code Online (Sandbox Code Playgroud)

但也没用.我确信必须有一个好的和简单的方法来做到这一点,但到目前为止我还没有找到它,并且一次尝试一件事给了我太多麻烦.有谁知道这个正确的流程?提前致谢!

xmpp rostering smack

6
推荐指数
1
解决办法
8247
查看次数

我们如何从xmpp服务器访问存档消息到android应用程序

我在xmpp.org网站上进行了简要概述,并阅读了与消息归档相关的所有内容(XEP-0136协议).阅读完所有文档之后,我还没有准确的方法开始实现我的android应用程序.这里的任何人都可以帮助我,我们如何实现,在客户端访问消息存档.我在我的应用程序中使用smack库.

android xmpp smack

6
推荐指数
1
解决办法
2400
查看次数

使用smack连接到Google Talk

我想开发一个连接到Google Talk的Java应用程序,允许用户与其朋友聊天.我正在使用smack API和以下代码:

ConnectionConfiguration config = new ConnectionConfiguration("talk.google.com",5222,"gmail.com");
SASLAuthentication.supportSASLMechanism("PLAIN", 0);
XMPPConnection connection  = new XMPPConnection(config);
try {
    connection.connect();
} catch (XMPPException e) {
    e.printStackTrace();
}
try {
    connection.login("username", "password");
} catch (XMPPException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了一个例外:

SASL authentication PLAIN failed: invalid-authzid: 
    at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:337)
    at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:203)
    at org.jivesoftware.smack.Connection.login(Connection.java:348)
    at Main.main(Main.java:21)
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个问题吗?

java google-talk smack

6
推荐指数
2
解决办法
6017
查看次数

如何在android服务中处理保持活动连接

我正在使用asmack作为一个Android IM应用程序,我正在使用AIDL接口的远程服务.

onStartCommand我的服务方法内部,我编写如下代码.我创建连接,然后使用它登录.当任何人在我的应用程序onCreate的主要活动方法中运行我的应用程序运行我的服务getApplicationContext.StartService(serviceIntent).它工作正常,但是messageListener我在服务内部附加的几分钟(有时10分钟,一些时间超过10分钟)停止接收消息.但我知道连接存在,因为同时我用xmppConnection它来发送消息它正在向用户B发送消息但是它没有收听来自用户B的消息.我不知道为什么我的听众停止听到消息.

public int onStartCommand(final Intent intent, final int flags, final int startId) {
    ConnectionConfiguration config = new ConnectionConfiguration(URL, MyPort, Host);
    xmppConnection = new XMPPConnection(config);
    xmppConnection.connect();
    xmppConnection.login("someid@sample.com", "testpass");
    xmppConnection.addPacketListener(myMessageListener, new PacketTypeFilter(Message.class));
    return START_STICKY;
}
private PacketListener myMessageListener = new PacketListener() {
    public void processPacket(Packet packet) {
        Message msg = (Message) packet;
    }
}
Run Code Online (Sandbox Code Playgroud)

请指导.

android xmpp smack android-intent asmack

6
推荐指数
1
解决办法
3201
查看次数

smack数据包监听器和消息监听器之间的区别

嗨,我正在创建一个Android应用程序作为XMPP客户端到ejabbered服务器.

但我真的很困惑,因为我看到我可以发送消息作为apacket或消息,我也可以使用PacketListener和收到消息MessageListener.

是什么PacketListenerMessageListener接收消息的好方法之间的区别是什么?使用数据包监听器或消息监听器?

android xmpp smack asmack

6
推荐指数
2
解决办法
1298
查看次数

如何从smack 4.1使用XEP 198(流管理)?

我是XMPP的新手.我在Android上使用smack在我的应用程序中提供聊天.

在smack 4.1中,添加了对流管理的支持,因此我使用了

  XMPPTCPConnection.setUseStreamManagementDefault(true);
Run Code Online (Sandbox Code Playgroud)

启用此功能,我得到:

03-27 00:50:54.945: D/SMACK(16991): SENT (5): <enable xmlns='urn:xmpp:sm:3' resume='true'/>
03-27 00:50:55.740: D/SMACK(16991): RECV (5): <enabled xmlns='urn:xmpp:sm:3' id='g2gCbQAAAAVTbWFja2gDYgAABZNiAAYRuGIAAW06' resume='true' max='300'/>
Run Code Online (Sandbox Code Playgroud)

因此,XEP 198在我的客户端和服务器上工作正常(ejabberd 15).

但我的问题是 - >我是否必须编写自己的代码来存储消息(服务器未确认)到我的android sqlite数据库中,并chat.sendMessage();在连接重新连接时手动重新发送它们?或者这个重发部分是由Smack自己完成的吗?

我没有得到任何关于在smack 4.1上使用XEP 198的文档 XMPPTCPConnection.setUseStreamManagementDefault(true);

是否有任何方法可以从smack听取<a/>从服务器收到的?

我见过yaxim的源代码,但似乎他们已经编写了自己的代码(通过发送数据包)来支持XEP 198,现在在Smack 4.1中完成了.

请帮助我在启用此支持后应该怎么做?

android xmpp ejabberd smack stream-management

6
推荐指数
1
解决办法
2526
查看次数

没有调用Smack消息监听器和连接不稳定

我有以下代码应该监听消息:

ChatManager chatmanager = ChatManager.getInstanceFor(xmppManager.getConnection());

chat = chatmanager.createChat(otherJabberId);

chat.addMessageListener(new ChatMessageListener() {
    @Override
    public void processMessage(Chat chat, Message message) {
        Log.e("message trigger", message.getBody());
    }
}
Run Code Online (Sandbox Code Playgroud)

但我的日志永远不会触发.

但是,setDebuggerEnabled(true)我的代码中有以下内容:10-31 15:41:51.264 28889-28993/com.lfdversluis.buurapp D/SMACK: RECV (0): <message to="test@app.buur.nu/Smack" type="chat" id="53" from="testje@app.buur.nu/Gajim"><body>test</body><request xmlns="urn:xmpp:receipts"/><thread>277945c1-772a-4d4b-8e1a-274153cfb8a6</thread></message>

所以收到了消息.我检查过,otherJabberId变量是正确的.只是听众没有触发.什么更奇怪,有时它只是工作正常.

我遇到的另一个问题是无法发送消息.

在这里,我有如上所述的聊天设置,并使用以下代码发送消息:

try {  
    chat.sendMessage(text.trim());  
    DataBaseManager db = new DataBaseManager(ChatActivity.this);  
    db.addMessageToDB(model);  

    addMessageToScreen(newMessage);  

} catch (SmackException.NotConnectedException ignored) {  
    XMPPManager manager = XMPPManager.getInstance();  
    manager.reconnect(); // Maybe we need to reconnect due to an interrupt and retry..  
    try {  
        chat.sendMessage(text.trim()); …
Run Code Online (Sandbox Code Playgroud)

android xmpp listener smack

6
推荐指数
1
解决办法
1587
查看次数

在XMPP中加入MUC房间时出错(smack)

我正在尝试创建一个多用户聊天.我在加入房间时遇到错误.创建聊天室的方法:

 public void createMultiUserChatRoom(String roomName, String nickName) {

            // Get the MultiUserChatManager
            MultiUserChatManager multiUserChatManager = MultiUserChatManager.getInstanceFor(connection);

            // Get a MultiUserChat using MultiUserChatManager
            MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(roomName+"@conference.localhost");

            try {
                multiUserChat.create(nickName);
               Form form = multiUserChat.getConfigurationForm();
               Form submitForm = form.createAnswerForm();

               List<FormField> formFieldList = submitForm.getFields();
               for (FormField formField : formFieldList) {
                 if(!FormField.Type.hidden.equals(formField.getType()) && formField.getVariable() != null) {
                submitForm.setDefaultAnswer(formField.getVariable());
                } 
               }

             submitForm.setAnswer("muc#roomconfig_persistentroom", true);
             submitForm.setAnswer("muc#roomconfig_publicroom", true);

              multiUserChat.sendConfigurationForm(submitForm);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
Run Code Online (Sandbox Code Playgroud)

加入MUC室的方法:

public void joinMultiUserChatRoom(String userName, String roomName) {
        // Get the …
Run Code Online (Sandbox Code Playgroud)

java xmpp openfire smack multiuserchat

6
推荐指数
1
解决办法
1565
查看次数

无法使用任何提供的主机建立套接字

我正在努力与android中的文件传输.我正在使用smack 4.1连接到openfire服务器.

我的问题是:当我使用Spark来Spark文件传输时,它运行正常.但是当我将文件从Spark传输到Android或Android到Android时,iq收到显示错误"无法使用任何提供的主机建立套接字",如下所示:

<iq id="018vq-231" to="sender@domain.com/Spark 2.6.3" from="receiver@domain.com/Smack" type="error">
  <error code="-1" type="CANCEL">
    <item-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
    <text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" xml:lang="en">Could not establish socket with any provided host</text>
  </error>
</iq>
Run Code Online (Sandbox Code Playgroud)

我的接收代码是:

FileTransferManager fileTransferManager = FileTransferManager.getInstanceFor(xmppTcpConnection);

fileTransferManager .addFileTransferListener(new FileTransferListener() {
                                @Override
                                public void fileTransferRequest(final FileTransferRequest request) {

                  final IncomingFileTransfer transfer = request.accept();

                  File file = new File("Path/To/Save", transfer.getFileName());

                  transfer.recieveFile(file);

            }       
                            });
Run Code Online (Sandbox Code Playgroud)

我的ProviderManager代码是:

我使用ServiceDiscoveryManager和ProviderManager作为:

ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(AppConstant.xmppTcpConnection);
            sdm.addFeature("http://jabber.org/protocol/disco#info");
            sdm.addFeature("jabber:iq:privacy");
            sdm.addFeature("jabber.org/protocol/si");

ProviderManager.addIQProvider("query",
                "http://jabber.org/protocol/bytestreams", new BytestreamsProvider());

        ProviderManager.addIQProvider("query",
                "http://jabber.org/protocol/disco#items", new DiscoverItemsProvider());

        ProviderManager.addIQProvider("query", …
Run Code Online (Sandbox Code Playgroud)

android xmpp file-transfer smack

5
推荐指数
1
解决办法
452
查看次数