Java Can';t使用ASmack发送或接收状态信息

Java Can';t使用ASmack发送或接收状态信息,java,android,xmpp,smack,asmack,Java,Android,Xmpp,Smack,Asmack,我正在尝试为Android开发一个XMPP聊天客户端(使用连接到C#/Unity的Java)。我已经让Java->Unity/C#连接工作得很好。我还下载了Asmack,可以生成一个库和我的包装器类,用于初始化到OpenFireXMPP服务器的连接。然而,我似乎无法得到发送或接收的存在。我可以登录,注册新用户,填充他们的花名册,发送消息,但不能发送任何状态 该代码自动注册以前从未使用过该应用程序的用户。它还使用一个预设的朋友列表,并用这些朋友自动填充花名册 代码如下所示(对不起,所有的调试行,在

我正在尝试为Android开发一个XMPP聊天客户端(使用连接到C#/Unity的Java)。我已经让Java->Unity/C#连接工作得很好。我还下载了Asmack,可以生成一个库和我的包装器类,用于初始化到OpenFireXMPP服务器的连接。然而,我似乎无法得到发送或接收的存在。我可以登录,注册新用户,填充他们的花名册,发送消息,但不能发送任何状态

该代码自动注册以前从未使用过该应用程序的用户。它还使用一个预设的朋友列表,并用这些朋友自动填充花名册

代码如下所示(对不起,所有的调试行,在使用Unity时不能使用断点):

public类ASmackWrapper
{
专用XMPPConnection连接;
私人字符串[]朋友;
私有静态最终字符串eventClass=“ASmackEventListener”;
私有静态ASmackWrapper;
公共静态ASmackWrapper实例()
{
System.out.println(“ASmackWrapper 1的instancecreator!”);
if(包装器==null)
wrapper=新的ASmackWrapper();
返回包装器;
}
公共ASmackWrapper()
{
System.out.println(“ASmackWrapper的构造函数”);
}
公共布尔寄存器(字符串用户,字符串传递){
AccountManager=connection.getAccountManager();
试一试{
Map attributes=newhashmap();
属性。放置(“电子邮件”、“我的电子邮件”);
acManager.createAccount(用户、通行证、属性);
}捕获(XMPPException e){
System.out.println(“无法自动注册用户”+user+”…服务器上的pass:“+pass+”。错误:“+e.getLocalizedMessage());
如果(例如getLocalizedMessage()包含(“冲突”))
return false;//密码错误,因为已经有一个具有该id的帐户!
返回false;
}
返回true;
}
public void setFriends(字符串[]\u friends){
朋友=你的朋友;
}
公共无效开始(字符串主机、字符串用户、字符串传递)
{
System.out.println(“Java:openConenction主机:“+host”);
ConnectionConfiguration cc=新的ConnectionConfiguration(主机,5222);
//抄送setSendPresence(真实);
this.connection=新的XMPPConnection(cc);
Connection.DEBUG_ENABLED=true;
试一试{
this.connection.connect();
}捕获(XMPPException e){
System.out.println(“连接到服务器时出错”);
返回;
}
如果(!this.connection.isConnected()){
System.out.println(“Java:未连接”);
OneError(“连接失败”);
返回;
}
布尔loginStatus=登录(用户,通过);
如果(!loginStatus){
OneError(“登录失败”);
返回;
}
RosterListener rl=新的RosterListener(){
已添加的公共无效项(集合地址){}
公共无效项已更新(集合地址){}
已删除公共无效项(集合地址){}
公共无效状态已更改(状态){
System.out.println(“状态已更改!”+presence.getFrom()+“”+presence.getStatus());
在场(在场);
}
};
if(connection.get花名册()!=null){
connection.get花名册().setSubscriptionMode(花名册.SubscriptionMode.accept_all);
系统输出打印项次(“7”);
connection.getRoster().addRosterListener(rl);
}
未经认证(“”);
系统输出打印项次(“10”);
//将状态设置为在线!
状态=新状态(Presence.Type.available);
setStatus(“在线,以编程方式!”);
存在。设置优先级(24);
presence.setMode(presence.Mode.available);
连接。发送数据包(存在);
}
私有void addFriends()引发异常{
if(friends==null){
System.out.println(“没有要添加的朋友”);
返回;
}
System.out.println(“要添加的好友数:“+friends.length”);

对于(inti=0;我成功了!这可能是因为我没有在花名册中的jid上使用正确的格式。正确的格式必须是user@myserver.se,而不仅仅是用户

编写一个名册列表,看看它是否有效

public void rosterOnlineStatus(){
    Roster roster = connection.getRoster();
    Presence status = new Presence(Type.available);
    status.setStatus("Hello This is Phaneendra");
    roster.addRosterListener(new RosterListener() {

        @Override
        public void presenceChanged(Presence presence) {

            System.out.println(presence.getFrom()+ "is "+presence+" "+presence.getStatus());
            presence.getStatus();


        }

        @Override
        public void entriesUpdated(Collection<String> addresses) {}

        @Override
        public void entriesDeleted(Collection<String> addresses) {}

        @Override
        public void entriesAdded(Collection<String> addresses) {}
    });
}
public void rosterOnlineStatus(){
花名册=connection.get花名册();
状态=新状态(类型可用);
status.setStatus(“你好,我是Phainedra”);
花名册.addRosterListener(新花名册Listener(){
@凌驾
公共无效状态已更改(状态){
System.out.println(presence.getFrom()+”是“+presence+”+presence.getStatus());
getStatus();
}
@凌驾
公共无效项已更新(集合地址){}
@凌驾
已删除公共无效项(集合地址){}
@凌驾
已添加的公共无效项(集合地址){}
});
}

查看添加名册列表是否有效?

可能是最新版本中的一个错误?:S我的最新线索是名册jid的格式错误。但是从“id”更改为id@xxx.tripnet.se“没有帮助:(
SENT <presence id="3sG7l-11"><status>Online, Programmatically!</status><priority>24</priority></presence>

RCV <presence id="6s7BX-5" to="787122012@xxx.tripnet.se/Smack" from="10000063946242" type="error">
<error code="404" type="cancel">
<remote-server-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
</error></presence>
org.jivesoftware.openfire.nio.ConnectionHandler - Closing connection due to error while processing message:
<iq id="566-4" type="error" from="xxx.tripnet.se/f55aea72" to="xxx.tripnet.se">
<error /><error type="cancel" code="501">
<feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" /></error>
<ping xmlns="urn:xmpp:ping" /></iq> 

java.lang.IllegalArgumentException: IQ must be of type 'set' or 'get'. Original IQ:
<iq id="566-4" type="error" from="xxx.tripnet.se/f55aea72" to="xxx.tripnet.se">
<error/><error type="cancel" code="501">
<feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error>
<ping xmlns="urn:xmpp:ping"/></iq> 
at org.xmpp.packet.IQ.createResultIQ(IQ.java:384) 
public void rosterOnlineStatus(){
    Roster roster = connection.getRoster();
    Presence status = new Presence(Type.available);
    status.setStatus("Hello This is Phaneendra");
    roster.addRosterListener(new RosterListener() {

        @Override
        public void presenceChanged(Presence presence) {

            System.out.println(presence.getFrom()+ "is "+presence+" "+presence.getStatus());
            presence.getStatus();


        }

        @Override
        public void entriesUpdated(Collection<String> addresses) {}

        @Override
        public void entriesDeleted(Collection<String> addresses) {}

        @Override
        public void entriesAdded(Collection<String> addresses) {}
    });
}