我是新来的粉碎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
我无法弄清楚这个问题的原因.请帮我解决这个问题.
提前致谢.
我知道之前已经问过这个问题,但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.org网站上进行了简要概述,并阅读了与消息归档相关的所有内容(XEP-0136协议).阅读完所有文档之后,我还没有准确的方法开始实现我的android应用程序.这里的任何人都可以帮助我,我们如何实现,在客户端访问消息存档.我在我的应用程序中使用smack库.
我想开发一个连接到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)
有人可以帮我解决这个问题吗?
我正在使用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客户端到ejabbered服务器.
但我真的很困惑,因为我看到我可以发送消息作为apacket或消息,我也可以使用PacketListener
和收到消息MessageListener
.
是什么PacketListener
和MessageListener
接收消息的好方法之间的区别是什么?使用数据包监听器或消息监听器?
我是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中完成了.
请帮助我在启用此支持后应该怎么做?
我有以下代码应该监听消息:
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) 我正在尝试创建一个多用户聊天.我在加入房间时遇到错误.创建聊天室的方法:
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) 我正在努力与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)