Smack库中的XEP-0080用户位置

7
我想在Java中创建一个简单的XMPP客户端,可以与其他客户端共享位置(XEP-0080)。我已经知道可以使用smack库来处理XMPP,并且它支持PEP,这是XEP-0080所需的。有没有人有实现此功能的示例或任何指针?我在谷歌上找不到任何内容。提前致谢。
3个回答

8
Kristof说得对,文档很稀少,但现在越来越好了。不过有一套关于扩展的文档还是很好的,只是有点难找。其中PubSub的文档在这里:http://www.igniterealtime.org/fisheye/browse/~raw,r=11613/svn-org/smack/trunk/documentation/extensions/pubsub.html
在使用扩展时,我曾尝试从头开始创建自定义IQ提供程序路线,但发现尽可能使用管理器更容易。编写管理器的开发人员已经抽象化了许多痛点。
以下是一个示例(修改后的geoloc版本,基于rcollier在Smack论坛上发布的示例):
ConfigureForm form = new ConfigureForm(FormType.submit);
form.setPersistentItems(false);
form.setDeliverPayloads(true);
form.setAccessModel(AccessModel.open);

PubSubManager manager 
      = new PubSubManager(connection, "pubsub.communitivity.com");
Node myNode = manager.createNode("http://jabber.org/protocol/geoloc", form);

StringBuilder body = new StringBuilder(); //ws for readability
body.append("<geoloc xmlns='http://jabber.org/protocol/geoloc' xml:lang='en'>");
body.append("   <country>Italy</country>");
body.append("   <lat>45.44</lat>");
body.append("   <locality>Venice</locality>");
body.append("   <lon>12.33</lon>");
body.append("   <accuracy>20</accuracy>");
body.append("</geoloc>");

SimplePayload payload = new SimplePayload(
                              "geoloc",
                              "http://jabber.org/protocol/geoloc", 
                              body.toString());
String itemId = "zz234";
Item<SimplePayload> item = new Item<SimplePayload>(itemId, payload);

// Required to recieve the events being published
myNode.addItemEventListener(myEventHandler);

// Publish item
myNode.publish(item);

或者至少这是一种较为困难的方式 :). 只需记住现在有一个PEP管理器...
PEPProvider pepProvider = new PEPProvider();
pepProvider.registerPEPParserExtension(
    "http://jabber.org/protocol/tune", new TuneProvider());
ProviderManager.getInstance().addExtensionProvider(
   "event", 
   "http://jabber.org/protocol/pubsub#event", pepProvider);
Tune tune = new Tune("jeff", "1", "CD", "My Title", "My Track");
pepManager.publish(tune);

您需要编写GeoLocProvider和GeoLoc类。


在Smack或aSmack中,我在哪里可以找到TuneProviderTune类? - Hunt
1
这个例子来自Smack文档。不确定他们所指的XEP-0118实现是什么,因为Smack仍有一个未解决的错误来添加XEP-0118支持,最后更新于2011年5月。我曾经拼凑出自己的版本进行实验,但现在没有代码了。我可以再次把它组合起来,但没有时间。现在有一个很好的示例,可以创建自己的PEPItem扩展并发布项目:http://oneminutedistraction.wordpress.com/2010/08/26/。这只留下了解析部分(在TuneProvider中,即PEPProvider)。 - Bill Barnhill
我正在使用Smack 4.2.0,但是找不到PEPProvider? - umerk44

1

0

看一下其他扩展实现的现有代码。这将是您开发当前库的最佳示例。不幸的是,我不知道是否有开发人员指南,所以我只是自己探索了一些基础知识,直到我感到对环境感到舒适为止。提示:使用提供程序扩展功能添加自定义提供程序以针对特定扩展进行操作。

您可以在Smack的开发者论坛上提问,并从这里向项目贡献您的代码。如果您实现了此扩展的实现,则可以自行获得提交权限(如果需要的话)。


首先,非常感谢您的快速回答。您是否也知道我可以在哪里找到这样的实现? - Kristof
它们都是现有 Smack 代码库的一部分(用于 svn 访问)svn co http://svn.igniterealtime.org/svn/repos/smack/trunk smack,或者您可以在此处在线浏览 http://www.igniterealtime.org/fisheye/viewrep/svn-org/smack。 - Robin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接