我正在开发基于asmack lib的Android上的聊天应用程序.我在ListView上显示所有用户,但我使用图像显示在线/离线用户.但它只返回离线图像,即使用户在线,这里是我的代码
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.buddies);
Controller.getInstance().roster = Controller.getInstance().connection.getRoster();
// ArrayList<Buddy> buddies = new ArrayList<Buddy>();
Collection<RosterEntry> entries = Controller.getInstance().roster.getEntries();
Controller.getInstance().buddyList = new Buddy[entries.size()];
int i = 0;
for (RosterEntry r : entries) {
Buddy bud = new Buddy();
VCard card = new VCard();
try {
ProviderManager.getInstance().addIQProvider("vCard",
"vcard-temp", new VCardProvider());
card.load(Controller.getInstance().connection, r.getUser());
} catch (XMPPException e) {
Log.e("ChatOnAndroid", e.getMessage() + " " + r.getUser() + " "
+ e.getLocalizedMessage());
}
bud.jid …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,聊天是一个模块,聊天我正在使用xmpp.当我发送消息时,我使用DeliveryReceiptManager获取该消息传递状态.
DeliveryReceiptManager.getInstanceFor(connection).enableAutoReceipts();
DeliveryReceiptManager.getInstanceFor(connection).addReceiptReceivedListener(new ReceiptReceivedListener()
{
@Override
public void onReceiptReceived(String arg0, String arg1, String arg2)
{
Log.v("app", arg0 + ", " + arg1 + ", " + arg2);
}
});
Run Code Online (Sandbox Code Playgroud)
但我需要证明该消息是用户READ或不像whatsApp蓝色tickmark,任何人都可以帮助我,我在这里被击中.如何实现此消息读取概念.
提前致谢.
我启动openFire并用spark测试它一切正常但是当我尝试在android studio中连接smack 4.2.0时出现此错误:
Ljavax /命名/目录/ InitialDirContext;
我的依赖是这样的:
编译"org.igniterealtime.smack:smack-java7:4.2.0"compile"org.igniterealtime.smack:smack -tcp:4.2.0"compile"org.igniterealtime.smack:smack-im:4.2.0"compile" org.igniterealtime.smack:smack-extensions:4.2.0"compile"org.igniterealtime.smack:smack-android-extensions:4.2.0"compile"org.igniterealtime.smack:smack-bosh:4.2.0"
当从依赖项中删除这个:"编译org.igniterealtime.smack:smack-java7:4.2.0"并添加它:compile"org.igniterealtime.smack:smack-android:4.2.0"我的依赖项变成这样:
编译'com.android.support:appcompat-v7:24.0.0'compile"org.igniterealtime.smack:smack-android:4.2.0"compile"org.igniterealtime.smack:smack -tcp:4.2.0"compile" org.igniterealtime.smack:smack-im:4.2.0"compile"org.igniterealtime.smack:smack-extensions:4.2.0"compile"org.igniterealtime.smack:smack-android-extensions:4.2.0"compile" org.igniterealtime.smack:咂嘴波什:4.2.0"
我收到此错误:
org.jivesoftware.smack.SmackException $ ConnectionException:以下地址失败:'192.168.209.2:5222'失败,原因是:de.measite.minidns.hla.ResolutionUnsuccessfulException:要求192.168.209.2.IN A产生错误响应NX_DOMAIN,'192.168.209.2:5222'失败,原因是:de.measite.minidns.hla.ResolutionUnsuccessfulException:要求192.168.209.2.在AAAA中产生了错误响应NX_DOMAIN
当我尝试conn.connect()时出现错误的代码部分是这样的:
XMPPTCPConnectionConfiguration config = null;
try {
config = XMPPTCPConnectionConfiguration.builder()
.setUsernameAndPassword("admin", "thepass")
.setXmppDomain("192.168.1.3")
.setHost("192.168.209.2")
.setPort(5222)
.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
.build();
} catch (Exception e) {
e.printStackTrace();
}
AbstractXMPPConnection conn1 = new XMPPTCPConnection(config);
conn1.setReplyTimeout(60000);
conn1.setPacketReplyTimeout(60000);
conn1.connect();
Run Code Online (Sandbox Code Playgroud) 我将smack升级到4.2.0后,我遇到了连接问题.
The following addresses failed: 'xxxx:5222' failed because:
de.measite.minidns.hla.ResolutionUnsuccessfulException: Asking for xxxx. IN A yielded an error response NX_DOMAIN, '52.90.233.38:5222' failed because: de.measite.minidns.hla.ResolutionUnsuccessfulException: Asking for xxxx. IN AAAA yielded an error response NX_DOMAIN
Run Code Online (Sandbox Code Playgroud)
在连接配置构建器中设置主机时会发生此问题.
例如:
.setHost(ServiceConstants.CHAT_SERVER)
Run Code Online (Sandbox Code Playgroud)
请参阅https://github.com/igniterealtime/Smack/wiki/Smack-4.2-Readme-and-Upgrade-Guide
这是我的最终配置,它在Davood Falahati帮助之后起作用!
InetAddress inetAddress = InetAddress.getByName(ServiceConstants.CHAT_SERVER);
XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder()
.setXmppDomain(JidCreate.from(ServiceConstants.CHAT_SERVER).asDomainBareJid())
.setPort(5222)
.setHostAddress(inetAddress)
.setDebuggerEnabled(true)
.setSendPresence(true)
Run Code Online (Sandbox Code Playgroud) 在Smack API中,有一个用于连接的配置类,在此页面中进行了描述
我对服务名称和服务器名称之间的区别感到困惑.
假设我有一台名为"mybox.mydomain.com"的计算机,我在ejabberd上配置了一个名为"myhost"的主机(使用{hosts, ["myhost"]}.ejabbed.cfg中的行),
在这种情况下,主机名,服务器名称和服务名称是什么?
我正在使用Openfire XMPP服务器开发聊天应用程序.我可以在两个用户之间进行文字聊天 但是我想在某人输入消息时知道打字状态.所以我创建了一个类: -
public class typingStatus implements ChatStateListener {
@Override
public void processMessage(Chat arg0, Message arg1) {
// TODO Auto-generated method stub
}
@Override
public void stateChanged(Chat arg0, ChatState arg1) {
// TODO Auto-generated method stub
System.out.println(arg0.getParticipant() + " is " + arg1.name());
}
}
Run Code Online (Sandbox Code Playgroud)
但我很困惑,它将如何运作?我知道我需要一个数据包,我可以在Listener中使用它.但我无法找到该数据包.
请任何人建议,它将如何运作?
还有Smack和asmack有什么区别?
谢谢!
我正在使用asmack库实现聊天应用程序.我想启动一个始终运行的服务,其中所有的连接管理任务都要完成,并且应该继续接收传入的数据包并将消息保存在我的sqlite数据库中.当我的应用程序启动时,我希望我的应用程序也会收到通知消息,而后台服务将消息插入sqlite数据库.如何用粘性服务实现这样的结构.是否还需要部分唤醒锁定.因为,有时也会根据特定需求使用http来下载图像.
我在Android应用程序中使用Smack库v4.1.0(不是aSmack)进行聊天功能.我似乎无法使用以下两个功能:
对于User Presence,我使用以下始终返回的代码null.
Presence userPresence = roster.getPresence(toUser);
System.out.println("*** User status: " + userPresence.getStatus());
if (userPresence.getMode() == Presence.Mode.available || userPresence.getMode() == Presence.Mode.chat) {
lblIsTyping.setText("Online");
} else {
lblIsTyping.setText("Offline");
}
Run Code Online (Sandbox Code Playgroud)
对于消息状态,我使用以下代码:
private class MessageListenerImpl implements MessageListener, ChatStateListener {
@Override
public void processMessage(Chat chat, Message message) {
processMessageCore(message);
}
@Override
public void stateChanged(Chat chat, ChatState chatState) {
System.out.println("*** chat: " + chat.toString());
if (ChatState.composing.equals(chatState)) {
lblIsTyping.setText("typing...");
System.out.println("Chat State: " + chat.getParticipant() + " is typing..");
}
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 我有一个实现Smack 4.1.7的Java应用程序,我将其用作Openfire 4.0.2的模拟客户端.目前,Openfire正在我的localhost上运行.Smack可以使用此连接正确登录和验证:
XMPPTCPConnectionConfiguration conf = XMPPTCPConnectionConfiguration.builder()
.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
.setServiceName(XMPP_HOST_NAME) // equals xmppDomain on server
.setUsernameAndPassword("user1", "pwd1")
.setResource("tester")
.setDebuggerEnabled(true)
.build();
Run Code Online (Sandbox Code Playgroud)
现在当Smack尝试创建或加入MUC时,请求超时(SmackException $ NoResponseException)和Openfire记录以下内容:
2016.07.03 18:58:54 org.jivesoftware.openfire.spi.RoutingTableImpl -
Unable to route packet. Packet should only be sent to available sessions and the
route is not available.
<presence id="WrkXH-6" from="user1@localhost/tester" to="user1@localhost/tester">
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="NfJ3flI83zSdUDzCEICtbypursw="/>
</presence>
2016.07.03 18:58:54 org.jivesoftware.openfire.spi.RoutingTableImpl -
Failed to route packet to JID: user1@localhost/tester packet:
<presence id="WrkXH-6" from="user1@localhost/tester" to="user1@localhost/tester">
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="NfJ3flI83zSdUDzCEICtbypursw="/>
</presence>
Run Code Online (Sandbox Code Playgroud)
我在服务器端和客户端都使用了"localhost","127.0.0.1"和我的机器名称作为XMPP_HOST_NAME,我不断收到同样的错误.任何帮助,将不胜感激.
我正在使用XMPP在我的Android应用程序中实现聊天,我已经使用了Smack API.我的聊天工作正常,我在本地保存Android设备上的所有聊天消息.以下是我目前面临的一些问题.
请建议我正确的XMPP(openfire)实施方式.所以,它像whatsapp一样无缝地工作.用户在互联网重新连接或活动打开后立即连接为新实例等.它的1对1聊天,即一次只有两个用户连接.在此先感谢,请不要降级我的问题,因为我是XMPP实施的新手.