通过smack登录XMPP服务器时,我只发送用户ID /密码组合.
服务器组件实际上是否在完整的JID中使用"resource"参数?
例如ali @ someplace/resource
发送它有什么好处?
我有这个代码,几乎没有修改过的例子:
UserSearchManager usm = new UserSearchManager(conn);
Form searchForm = usm.getSearchForm("search.myserver.com");
Form answerForm = searchForm.createAnswerForm();
answerForm.setAnswer("Username", true);
answerForm.setAnswer("search", contact.getJid());
ReportedData data = usm.getSearchResults(answerForm, "search.myserver.com");
Run Code Online (Sandbox Code Playgroud)
这在桌面环境中完美地运行,使用Smack库,但我不能让它在Android中工作(我必须使用asmack).
问题是searchForm为null,因为getSearchForm返回null.这看起来很奇怪,因为我似乎无法找到哪些方法应该返回null的任何文档.
服务器是Openfire,如果有帮助的话.
嗨,我打算开发一个聊天客户端,可以连接到gtalk facebook等...我决定使用smack API和openfire ..
但是我对如何在openfire服务器上使用它几乎没有什么指导.
openfire是否提供基本的用户界面,如登录框聊天窗口等...
我需要知道如何使用openfire插入或使用smack
谢谢:)
这个错误出现在日志中.
from='kutbi1@360degree/Smack' to='akash@360degree/Smack' type='error' id='hK1L6-5'>
<si xmlns='http://jabber.org/protocol/si' id='jsi_191216212994140179' mime-type='image/png' profile='http://jabber.org/protocol/si/profile/file-transfer'>
<file xmlns='http://jabber.org/protocol/si/profile/file-transfer' name='this_old_house.png' size='12623'>
<desc>You won't believe this!</desc></file>
<feature xmlns='http://jabber.org/protocol/feature-neg'>
<x xmlns='jabber:x:data' type='form'><field var='stream-method' type='list-multi'>
<option><value>http://jabber.org/protocol/bytestreams</value></option>
<option><value>http://jabber.org/protocol/ibb</value></option>
</field>
</x>
</feature>
</si>
<error code='503' type='cancel'>
<service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error></iq>
Run Code Online (Sandbox Code Playgroud)
我在这里使用以下代码
ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(Main.connection);
if (sdm == null)
sdm = new ServiceDiscoveryManager(Main.connection);
sdm.addFeature("http://jabber.org/protocol/disco#info");
sdm.addFeature("jabber:iq:privacy");
FileTransferNegotiator.setServiceEnabled(Main.connection, true);
FileTransferManager manager = new FileTransferManager(Main.connection);
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(id
+ "/Smack");
Log.i("transfere file", "outgoingfiletransfere is created");
try{
//OutgoingFileTransfer.setResponseTimeout(60000);
transfer.sendFile(new File(txt_file.getText().toString()), "You won't believe this!");
if (transfer.getStatus().equals(Status.cancelled) …
Run Code Online (Sandbox Code Playgroud) public void ReceiveFile() {
ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection);
if (sdm == null)
{
sdm = new ServiceDiscoveryManager(connection);
Log.e("service discovery", "SDM");
sdm.addFeature("http://jabber.org/protocol/disco#info");
sdm.addFeature("jabber:iq:privacy");
}
FileTransferManager manager = new FileTransferManager(connection);
Log.e("after manager", "manager");
manager.addFileTransferListener(new FileTransferListener() {
public void fileTransferRequest(final FileTransferRequest request) {
new Thread(){
@Override
public void run() {
Log.e("Thread running", "starting");
IncomingFileTransfer transfer = request.accept();
File mf = Environment.getExternalStorageDirectory();
Log.e("path", mf.getAbsoluteFile()+"/DCIM/" + transfer.getFileName());
File file = new File(mf.getAbsoluteFile()+"/DCIM/" + transfer.getFileName());
try{
transfer.recieveFile(file);
while(!transfer.isDone()) {
try{
Thread.sleep(1000L);
}catch (Exception e) {
Log.e("", …
Run Code Online (Sandbox Code Playgroud) 我一直试图在Ravi Tamada的教程 - AndroidHive上学习Android编程数周.我创建了一个执行创建,读取,更新和删除操作(CRUD)的应用程序.与此类似.
现在,我在我的应用程序中想要的是另一个功能,即每当在数据库中创建和/或更新新数据时,该应用程序就会向具有相同应用程序的其他Android手机发送通知.
我研究过了Google Cloud Messaging,AndroidHive也有一个教程.我看到它的方式是只有服务器可以向设备发送通知而GCM不能这样做:"设备到另一个设备"例如,"设备创建数据 - >发送到数据库 - > GCM将通知发送到其他设备" .如我错了请纠正我.
所以我再次搜索,发现你可以使用Smack for Instant Messaging app.类似于我希望我的应用程序完成的事情.但是我无法理解和实现Smack到Java和Android.
所以我想知道的是:
1.)GCM是否可以收听设备以检查应用程序是否更改了数据库并向其他设备发送数据库中存在更改的通知?
2.)你有没有关于如何在Java-Android中基本理解和实现Smack的"noob-friendly"文章链接?
谢谢.
首先,我想提供一些背景信息:我想使用XMPP在各种客户端之间交换非结构化数据.数据源应该将其数据简单地发布到Mulit-User-Chat room(XEP-0045),以便任何感兴趣的客户端都可以注册.XMPP MUC服务可以有各种聊天室,为了找到我的数据源推送信息的那些,我想为那个房间设置一些自定义标识.我认为muc#roominfo_ <custom_ident>带有一些自定义值将是很好的完成.
出于测试目的,我编写了一个在XMPP服务上创建MUC的应用程序.认证等一切正常.我正在使用Smack与XMPP服务器通信并创建房间.当我创建房间时,我在包含我的自定义信息之前在我请求的表单字段中添加了一个字段.MUC已创建并可访问.但是当我在房间的JID上执行迪斯科#info时,不会返回创建的自定义字段.
我用(3.8.2)的本地安装测试了这个.
我只是想知道,如果这是Openfire的问题,那么在创建MUC时,或者根据XEP-0045不允许存储自定义表单字段(XEP- 0045中使用的XEP-0068)?我阅读了MUC的规范,关键是相应的部分,但是找不到任何说服我的证据,显然不可能为MUC创建这样的自定义表单字段.也许我只是误解了规范中的某些内容?有没有人尝试类似的东西,它的工作?如果是Openfire的问题,我可以尝试不同的XMPP服务器.
我正在开发基于Android的XMPP的聊天应用程序.
我已经完成了一对一的聊天功能,但在多用户聊天中遇到了一些问题.我已经成功创建了新的聊天室,多个用户可以加入该会议室.我也addPacketListener
为团体聊天编写了代码PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);
当用户在组中发送消息时,我也在该侦听器中接收消息,但我无法区分哪个用户已发送消息.
像一对一的聊天消息包具有message.getFrom()
检索发件人JID的功能.
在多用户聊天的情况下,相同的功能将组/房间JID作为发送者返回.
我还试图在发送设置消息的属性message.setFrom(senderJID);
或message.setFrom(sendername@conference.hostname/Groupname);
仍然我无法获得senderJID或其昵称.
所以我的问题是:如何获取发件人用户JID或其昵称?来自messageListener中的消息(数据包)
在组中发送消息的代码是: -
String to = strGroupJID;
String text = etChatOnTextBox.getText().toString();
if(!text.equals(""))
{
Message msg = new Message(to, Message.Type.groupchat);
msg.setBody(text);
String name1 = xmppConnection.getUser();
name1 = name1.substring(0, name1.lastIndexOf("@"));
name1 = name1 + "@conference.192.168.56.1";
// name1 = name1 + "@conference.192.168.56.1/" + strGroupName ;
msg.setFrom(name1);
muc.sendMessage(msg);
}
Run Code Online (Sandbox Code Playgroud)
接收消息的代码是: -
PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);
connection.addPacketListener(new PacketListener() {
@Override
public void processPacket(Packet packet) { …
Run Code Online (Sandbox Code Playgroud) 我的应用程序出了问题,我想在其中创建一个连接到我的服务器的简单XMPP客户端.当我启动应用程序(编译运行没有问题)时,我遇到了以下问题,但我的应用程序立即关闭.
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/jxmpp/util/XmppStringUtils;
at org.jivesoftware.smack.provider.ProviderManager.getKey(ProviderManager.java:314)
at org.jivesoftware.smack.provider.ProviderManager.addStreamFeatureProvider(ProviderManager.java:304)
at org.jivesoftware.smack.provider.ProviderManager.addLoader(ProviderManager.java:140)
at org.jivesoftware.smack.initializer.UrlInitializer.initialize(UrlInitializer.java:54)
at org.jivesoftware.smack.SmackInitialization.loadSmackClass(SmackInitialization.java:232)
at org.jivesoftware.smack.SmackInitialization.parseClassesToLoad(SmackInitialization.java:193)
at org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:163)
at org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:148)
at org.jivesoftware.smack.SmackInitialization.<clinit>(SmackInitialization.java:116)
at org.jivesoftware.smack.SmackConfiguration.getVersion(SmackConfiguration.java:96)
at org.jivesoftware.smack.ConnectionConfiguration.<clinit>(ConnectionConfiguration.java:38)
at org.reisacher.zapp.Main.login(Main.java:30)
at org.reisacher.zapp.Main.onCreate(Main.java:73)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.jxmpp.util.XmppStringUtils" on path: DexPathList[[zip file "/data/app/org.reisacher.zapp-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469
at org.jivesoftware.smack.provider.ProviderManager.getKey(ProviderManager.java:314) …
Run Code Online (Sandbox Code Playgroud) 我正在Android平台上使用XMPP协议和Openfire服务器实现消息传递应用程序.我需要保存并加载自己的Vcard和其他用户vcard.目前,我设法将我的vCard保存在服务器上并可以再次加载它.问题在于其他用户的Vcards,服务器总是返回XMPPError:功能未实现 - 取消.
我用这个库:
compile 'org.igniterealtime.smack:smack-android:4.1.2-SNAPSHOT'
compile 'org.igniterealtime.smack:smack-tcp:4.1.2-SNAPSHOT'
compile 'org.igniterealtime.smack:smack-extensions:4.1.2-SNAPSHOT'
Run Code Online (Sandbox Code Playgroud)
显示代码:
保存我自己的Vcard(工作正常).
VCardManager vCardManager = VCardManager.getInstanceFor(connection);
VCard vCard;
vCard = vCardManager.loadVCard();
vCard.setNickName("User name");
URL urldefault = new URL("Avatar URL");
InputStream stream = urldefault.openStream();
byte[] avatar1 = readBytes(stream);
vCard.setAvatar(avatar1, "avatar1/jpg");
vCard.setEmailHome("user email");
vCard.setPhoneHome("mobile", "888888888");
vCardManager.saveVCard(vCard);
Run Code Online (Sandbox Code Playgroud)
加载我自己的Vcard(工作正常)
VCard vCard = null;
VCardManager vCardManager = VCardManager.getInstanceFor(connection);
vCard = vCardManager.loadVCard();
Run Code Online (Sandbox Code Playgroud)
问题出在这里.加载其他用户Vcard:
VCardManager vCardManager = VCardManager.getInstanceFor(connection);
boolean isSupported = vCardManager.isSupported(user);
if (isSupported) // return true
vCard = vCardManager.loadVCard(user);
Run Code Online (Sandbox Code Playgroud)
加载Vcard的用户名是正确的.
有任何想法吗?
提前致谢.