解决方案 »
- 求解关于DownloadManager下载
- android程序运行空指针问题。
- android.os.NetworkOnMainTheadException错误导致的原因和解决的办法
- android 4.0 assets目录下的样式 访问res下的图片问题(与2.x不兼容)
- JDK6.0, 7.0不能安装在windows32位机器上?
- 很奇怪,android2.1真机无法取得生日,而模拟器的编辑联系人就没有生日字段
- 求教顶级android高手<虚拟键盘会把split action bar 顶上来>
- 如何实现如图功能啊
- btnStartAty1.setonclicklistener为何提示错误:setonclicklistener cannot be resolved or i
- vs2012 cocos2dx中CCControlButton绑定点击事件无回调
- 请问关于viewpage + fragment的有关滑动的问题
- android 华为手机导航栏影响界面布局
如果安装OK的话看看下面的代码package com.example.smack;
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.PacketCollector;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.AndFilter;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.PacketIDFilter;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Registration;
import org.jivesoftware.smackx.MessageEventManager;import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
/**
*
*
* 用asmack注册用户有以下几个步骤,自底向上:
* 1:注册用户用调用的方法是:PacketCollector collector=connection.createPacketCollector(filter)
* filter 作为参数传递进去,因此需要 filter
* connetion 是一个连接openfire服务器的连接对象
* XMPPConnection 是 Connection 类的一个子类
* collector 用于获取注册返回结果用,
* IQ result = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
* result中包含注册是否成功的信息,详情查看API
*
*
*
*
* 2
* PacketFilter filter = new AndFilter(new PacketIDFilter(reg.getPacketID()),new PacketTypeFilter(IQ.class))
*
* PacketFilter是一个接口,被AndFilter所实现
* AndFilter有一个构造方法AndFilter(PacketFilter...filters)
* 由此可知 PacketIDFilter 类和 PacketTypeFilter 类也实现了PacketFilter接口
*
* reg是 Registration 的一个对象,要注册账号必须要用到此类,它里面可以设置用户名和密码
* reg 也是 IQ 类的一个子类,因此,在 new AndFilter() 时第二个参数 new PacketTypeFilter()的参数必须为IQ.class
* reg 如下定义
* Registration reg = new Registration();
* reg.setType(IQ.Type.SET);
* reg.setTo(connection.getServiceName());
*
* reg.setUsername(account); 设置用户名
* reg.setPassword(password); 设置密码
*
* 以上代码的正确顺序为:
* Registration reg = new Registration();
* reg.setType(IQ.Type.SET);
* reg.setTo(connetion.getServiceName());
* reg.setUsername(account);
* reg.setPassword(password);
* reg.addAttribute("android", "geolo_createUser_android"); 这一句可有可无
* PacketFilter filter = new AndFilter(new PacketIDFilter(
* reg.getPacketID()), new PacketTypeFilter(IQ.class));
*
* PacketCollector collector = connetion.createPacketCollector(
* filter);
* 最后不要忘了
* getConnection().sendPacket(reg); 发送数据包进行注册
* IQ result = (IQ) collector.nextResult(
* SmackConfiguration.getPacketReplyTimeout()); 接受注册响应
*
*里面相关的继承实现关系
*
*Packet---派生出-->IQ--派生出-->Registration
*
*Connection---派生出---->XMPPConnection
*
*PacketFilter--被实现于--->AndFilter
*
*PacketFilter--被实现于--->PacketIDFilter
*PacketFilter--被实现于--->PacketTypeFilter
* */
public class MainActivity extends Activity {
private XMPPConnection connection;
private Button btn;
private Button createroom;
private Button sendMsg;
private Chat chat;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) this.findViewById(R.id.btn);
createroom = (Button) this.findViewById(R.id.create);
sendMsg = (Button) this.findViewById(R.id.sendMsg);
//开启异步任务,连接服务器 详情请看 ConnectAsync类
//第一个参数服务器ip地址(如果用本机做服务,就是本机的ip地址,
//用手机测试要保证手机和服务器能连上外网)
//第二个参数是端口号
new ConnectAsync().execute("192.168.0.105","5222");
//按钮点击注册,如果连接成功,点击该按钮后可以注册一个用户,到时候登录openfire就可以看到用户增加了一个
btn.setOnClickListener(new OnClickListener(){ @Override
public void onClick(View v) {
// TODO Auto-generated method stub
//调用注册方法
String result=regist("lisi","123456");
Toast.makeText(MainActivity.this, result, 0).show();
}});
}
private class ConnectAsync extends AsyncTask<String, Integer, XMPPConnection>{
//通过ip地址和端口号获取XMPPConnection对象
//XMPPConnection是通信的管道,很重要
@Override
protected XMPPConnection doInBackground(String... params) {
ConnectionConfiguration config = new ConnectionConfiguration(params[0], Integer.parseInt(params[1]));
config.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
config.setSASLAuthenticationEnabled(false);
XMPPConnection mconnection = new XMPPConnection(config);
try {
mconnection.connect();
return mconnection;
} catch (XMPPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//将得到的XMPPConnection返回给主线程中的connection,以便注册通信的后续操作
@Override
protected void onPostExecute(XMPPConnection result) {
connection=result;
super.onPostExecute(result);
}
}
//注册函数,在上面有注释已经详述了,不再赘述
public String regist(String username,String pwd){
if(connection==null)
return "0";
Registration reg=new Registration();
reg.setType(IQ.Type.SET);
reg.setTo(connection.getServiceName());
reg.setUsername(username);
reg.setPassword(pwd);
PacketFilter filter = new AndFilter(new PacketIDFilter(reg.getPacketID()),new PacketTypeFilter(IQ.class));
PacketCollector collector = connection.createPacketCollector(filter);
connection.sendPacket(reg);
IQ result = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
collector.cancel();
if (result == null) {
Log.e("regist", "No response from server.");
return "0";
} else if (result.getType() == IQ.Type.RESULT) {
Log.v("regist", "regist success.");
return "1";
} else { // if (result.getType() == IQ.Type.ERROR)
if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {
Log.e("regist", "IQ.Type.ERROR: "
+ result.getError().toString());
return "2";
} else {
Log.e("regist", "IQ.Type.ERROR: "
+ result.getError().toString());
return "3";
}
}
}
}对了,要导入一个asmack的jar包,没有的话给你个链接http://asmack.freakempire.de/
去找android-asmack开头的jar包,我发现不知道为什么2014年的jar包里面有些方法没有,你就找2013年最新的jar包吧
最后不要忘记在清单文件中配置访问网络的权限
其实这个我也一直想做来着,所以研究了一下,也不是很懂,希望对你有帮助