上一节中未提到怎么获取对象:
XMPPConection connection =XMPPConnectionManager.getInstance().getConnection();
以后如果需要用到connection直接传入即可。
下面开始讲注册的实现:
<span style="white-space:pre"> </span>Registration reg = new Registration();
reg.setType(IQ.Type.SET);
reg.setTo(connection.getServiceName());
reg.setUsername(usernameEdt.getText().toString());
reg.setPassword(passwdEdt.getText().toString());
reg.addAttribute("android", "geolo_createUser_android");
//System.out.println("reg:" + reg);
PacketFilter filter = new AndFilter(new PacketIDFilter(reg
.getPacketID()), new PacketTypeFilter(IQ.class));
PacketCollector collector = connection
.createPacketCollector(filter);
connection.sendPacket(reg);
result = (IQ) collector.nextResult(SmackConfiguration
.getPacketReplyTimeout());
// Stop queuing results
collector.cancel();// 停止请求results(是否成功的结果)
if (result == null) {
Toast.makeText(getApplicationContext(), "服务器没有返回结果",
Toast.LENGTH_SHORT).show();
} else if (result.getType() == IQ.Type.ERROR) {
if (result.getError().toString().equalsIgnoreCase(
"conflict(409)")) {
Toast.makeText(getApplicationContext(), "这个账号已经存在",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "注册失败",
Toast.LENGTH_SHORT).show();
}
} else if (result.getType() == IQ.Type.RESULT) {
Toast.makeText(getApplicationContext(), "恭喜你注册成功",
Toast.LENGTH_SHORT).show();
}
这样,注册就完成了,代码比较简单,应该可以理解的,不理解可以在下面留言。
好的,下面开始讲解登陆,登陆的话用继承 AsyncTask实现,实现异步登陆。
/**
*
* 登录异步任务.
*/
public class LoginTask extends AsyncTask<String, Integer, Integer> {
private ProgressDialog pd;
private Context context;
private IActivitySupport activitySupport;
private String username,password;
public LoginTask(IActivitySupport activitySupport,String username,String password) {
this.activitySupport = activitySupport;
this.username = username;
<span style="white-space:pre"> </span>this,password = password;
this.pd = activitySupport.getProgressDialog();
this.context = activitySupport.getContext();
}
@Override
protected void onPreExecute() {
pd.setTitle("请稍等");
pd.setMessage("正在登录...");
pd.show();
super.onPreExecute();
}
@Override
protected Integer doInBackground(String... params) {
return login();
}
@Override
protected void onProgressUpdate(Integer... values) {
}
@Override
protected void onPostExecute(Integer result) {
pd.dismiss();
switch (result) {
case Constant.LOGIN_SECCESS: // 登录成功
Toast.makeText(context, "登陆成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
// if (loginConfig.isFirstStart()) {// 如果是首次启动
// intent.setClass(context, GuideViewActivity.class);
// loginConfig.setFirstStart(false);
// } else {
intent.setClass(context, LoginMainActivity.class);
// }
activitySupport.saveLoginConfig(loginConfig);// 保存用户配置信息
activitySupport.startService(); // 初始化各项服务
context.startActivity(intent);
break;
case Constant.LOGIN_ERROR_ACCOUNT_PASS:// 账户或者密码错误
Toast.makeText(
context,
context.getResources().getString(
R.string.message_invalid_username_password),
Toast.LENGTH_SHORT).show();
break;
case Constant.SERVER_UNAVAILABLE:// 服务器连接失败
Toast.makeText(
context,
context.getResources().getString(
R.string.message_server_unavailable),
Toast.LENGTH_SHORT).show();
break;
case Constant.LOGIN_ERROR:// 未知异常
Toast.makeText(
context,
context.getResources().getString(
R.string.unrecoverable_error), Toast.LENGTH_SHORT)
.show();
break;
}
super.onPostExecute(result);
}
// 登录
private Integer login() {
try {
XMPPConnection connection = XmppConnectionManager.getInstance()
.getConnection();
connection.connect();
System.out.println("sdasdasd");
connection.login(username, password); // 登录
System.out.println("sdasdasd");
OfflineMsgManager.getInstance(activitySupport).dealOfflineMsg(connection);//处理离线消息
connection.sendPacket(new Presence(Presence.Type.available));
return Constant.LOGIN_SECCESS;
} catch (Exception xee) {
if (xee instanceof XMPPException) {
XMPPException xe = (XMPPException) xee;
final XMPPError error = xe.getXMPPError();
int errorCode = 0;
if (error != null) {
errorCode = error.getCode();
}
if (errorCode == 401) {
return Constant.LOGIN_ERROR_ACCOUNT_PASS;
} else if (errorCode == 403) {
return Constant.LOGIN_ERROR_ACCOUNT_PASS;
} else {
return Constant.SERVER_UNAVAILABLE;
}
} else {
return Constant.LOGIN_ERROR;
}
}
}
}
然后呢,在点击登陆按钮后就可以执行此段代码就可以了,具体怎么执行呢?请看下面代码:
LoginTask loginTask = new LoginTask(LoginActivity.this,
username,password);//第一个参数是上下文,第二个就是传入参数用户名密码,没有用户名密码怎么登陆对吧 ,用户名密码自己获取输入框内容就好了。
loginTask.execute();//这句代码就是执行
这样登陆就实现了,是不是很简单啊,下面是修改密码
/**
* 修改密码
* @param connection
* @return
*/
public static boolean changePassword(XMPPConnection connection,String
pwd)
{
try {
connection.getAccountManager().changePassword(pwd);
return true;
} catch (Exception e) {
return false;
}
}
然后是注销:
/**
* 注销当前账号
* @param connection
* @return
*/
public static boolean deleteAccount(XMPPConnection connection)
{
try {
connection.getAccountManager().deleteAccount();
return true;
} catch (Exception e) {
return false;
}
}
传入的connection参数都是一样的,看文章开头。好,差不多了,可以讲下一节了