我正在尝试使用Smack库在Android上进行Facebook聊天.我已经从Facebook上阅读了聊天API,但我无法理解如何使用此库对Facebook进行身份验证.
任何人都可以指出我如何做到这一点?
更新:根据no.good.at.coding答案,我将此代码改编为Asmack库.一切正常,但我收到的是对登录的回复:未经授权.这是我使用的代码:
public class SASLXFacebookPlatformMechanism extends SASLMechanism
{
private static final String NAME = "X-FACEBOOK-PLATFORM";
private String apiKey = "";
private String applicationSecret = "";
private String sessionKey = "";
/**
* Constructor.
*/
public SASLXFacebookPlatformMechanism(SASLAuthentication saslAuthentication)
{
super(saslAuthentication);
}
@Override
protected void authenticate() throws IOException, XMPPException
{
getSASLAuthentication().send(new AuthMechanism(NAME, ""));
}
@Override
public void authenticate(String apiKeyAndSessionKey, String host,
String applicationSecret) throws IOException, XMPPException
{
if (apiKeyAndSessionKey == null || applicationSecret == null)
{
throw new …Run Code Online (Sandbox Code Playgroud) 我正在使用Java中的Smack API连接到我的XMPP服务器.
我想发送一个这样的自定义消息包:
<message to="you@MyServer.com" type="chat" MYFIELD="custom stuff">
<body> hi </body>
<CUSTOM_STANZA A="..." B="...">
C="..."
D="..."
</CUSTOM_STANZA>
</message>
Run Code Online (Sandbox Code Playgroud)
我猜我创建了我自己的Packet,它在它的toXML()方法中返回了这个XML.但这似乎不起作用.
任何帮助,将不胜感激.
我们已经在我们的应用程序中使用jabber smack api进行聊天.
现在我们计划通过添加语音/视频聊天来升级我的应用程序.
我认为它可能通过使用jingle jabber smack但我没有得到任何api或示例代码在jave中为jingle.
任何人都可以帮助我.
我正在开发一个聊天应用程序,用户将与域专家的一个组成员聊天.用户使用我的Android应用程序和域专家使用spark web进行聊天.我制作了Openfire安装程序和Spark Web设置,并使用aSmack库开发了Android聊天应用程序.我的应用用户可以与域专家聊天.到目前为止一切都很好.现在,我想在Android设备上显示用户与任何或特定专家的聊天记录.浏览网页后,我可以为我的开放式服务器安装Monitoring Service插件,该服务器显示管理员端用户的聊天记录,如下所示.
现在我想在我的Android应用程序中展示这段历史,我该如何实现这一目标.任何建议,最受欢迎.我正朝着正确的方向前进吗?还是有简单的方法来完成我的工作?有关此聊天历史记录将存储在Open Fire数据库中的任何信息,以便我可以使用Web服务进行SQL查询和获取数据,这是非常感谢.
我试图通过https://github.com/igniterealtime/Smack与Smack 4.1.0 rc1进行XMPP连接
我遵循了这个指南:https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide导入Gradle.
源代码:
package com.example.xmpp_app;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import java.io.IOException;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create the configuration for this new connection
XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
configBuilder.setUsernameAndPassword("test@example.com", "password123");
configBuilder.setResource("test");
configBuilder.setServiceName("example.com");
AbstractXMPPConnection connection = new XMPPTCPConnection(configBuilder.build());
// Connect to the server
try {
connection.connect();
} catch (SmackException e) …Run Code Online (Sandbox Code Playgroud) 我已经更改了我的应用程序以使用Smack 4.2替换Smack 4.1
但是我在config.setServiceName()中遇到错误;
此方法的参数已从String更改为DomainBareJid.我不知道如何在这个新的Smack中使用DomainBareJid和setServiceName.
XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration
.builder();
config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
config.setServiceName("What should i put here?");
config.setHost(serverAddress);
config.setPort(5222);
config.setDebuggerEnabled(true);
connection = new XMPPTCPConnection(config.build());
connection.setUseStreamManagement(true);
Run Code Online (Sandbox Code Playgroud)
如果我没有设置服务名称,那么我收到以下错误:
03-28 13:44:29.834: E/AndroidRuntime(7104): FATAL EXCEPTION: main
03-28 13:44:29.834: E/AndroidRuntime(7104): java.lang.RuntimeException: Unable to create service com.marothiatechs.cpm.MyService: java.lang.IllegalArgumentException: Must provide XMPP service name
03-28 13:44:29.834: E/AndroidRuntime(7104): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2715)
03-28 13:44:29.834: E/AndroidRuntime(7104): at android.app.ActivityThread.access$1600(ActivityThread.java:153)
03-28 13:44:29.834: E/AndroidRuntime(7104): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
03-28 13:44:29.834: E/AndroidRuntime(7104): at android.os.Handler.dispatchMessage(Handler.java:99)
03-28 13:44:29.834: E/AndroidRuntime(7104): at android.os.Looper.loop(Looper.java:137)
03-28 13:44:29.834: E/AndroidRuntime(7104): at android.app.ActivityThread.main(ActivityThread.java:5289)
03-28 13:44:29.834: E/AndroidRuntime(7104): at …Run Code Online (Sandbox Code Playgroud) 在构建Android版本apk时,Smack 4.1有哪些适当的ProGuard规则?
目前,我正在使用来自aSmack github存储库上的README.asmack文件的aSmack 4.0.x中的规则,该存档过时(引用旧类名,用于4.0.x).我找不到任何适用于4.1.x的正确程序规则的参考,是否有人可以解释这一点?
无法理解为什么会出现此错误并且应用程序崩溃.
低于错误:
Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.studyboard/com.studyboard.ChatMessageActivity}: java.lang.IllegalArgumentException: Must have a local (user) JID set. Either you didn't configure one or you where not connected at least once
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2493)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2555)
at android.app.ActivityThread.access$800(ActivityThread.java:176)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1437)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5576)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
Caused by java.lang.IllegalArgumentException: Must have a local (user) JID set. Either you didn't configure one or you where not connected at least once
at org.jivesoftware.smack.filter.IQReplyFilter.<init>(IQReplyFilter.java:94)
at org.jivesoftware.smack.AbstractXMPPConnection.createPacketCollectorAndSend(AbstractXMPPConnection.java:690) …Run Code Online (Sandbox Code Playgroud) 我使用Openfire(xmpp)服务器构建了一个聊天应用程序.一对一的人聊天工作正常,消息即时传递.但是当我们在组内发送消息时,第一条消息会被延迟,第二条消息会立即传递.
MultiUserChatManager groupChat =
MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");
Run Code Online (Sandbox Code Playgroud)
为什么第一条消息会被延迟?
MUC创作是
MultiUserChatManager mchatManager = MultiUserChatManager.getInstanceFor(xmpptcpConnection);
MultiUserChat mchat = mchatManager.getMultiUserChat(group);
if (!mchat.isJoined()) {
Log.d("CONNECT", "Joining room !! " + group + " and username " + username);
boolean createNow = false;
try {
mchat.createOrJoin(username);
createNow = true;
} catch (Exception e) {
Log.d("CONNECT", "Error while creating the room " + group + e.getMessage());
}
if (createNow) {
Form form = mchat.getConfigurationForm();
Form submitForm = form.createAnswerForm();
List<FormField> formFieldList = submitForm.getFields();
for (FormField formField : …Run Code Online (Sandbox Code Playgroud) 如何在PubSub中获取离线消息?使用Smack库.搜索后我找到了一个如下所示的答案:
// Create a pubsub manager using an existing XMPPConnection
PubSubManager mgr = PubSubManager.getInstanceFor(con);
// Get the node
LeafNode node = mgr.getNode("testNode");
List<? extends Item> items = node.getItems(100);
Run Code Online (Sandbox Code Playgroud)
但node.getItems(100)返回最后100条消息,也可以在线和离线.
1)如何使用smack跟踪pubsub中的在线和离线消息?
2)是否可以使用smack在pubsub中获取未读消息计数?如果是,那么如何实现呢?
3)如何知道谁(发布者)在节点中发送此消息?
我刚从这里 和这里浏览了Smack和PubSub的文档,但没有找到与我的查询相关的解决方案.那么有人可以帮我解决这个问题吗?