Bmob提供了一个专门的用户类——BmobUser来自动处理用户账户管理所需的功能。
属性
BmobUser除了从BmobObject继承的属性外,还有几个特定的属性:
username: 用户的用户名(必需)。
password: 用户的密码(必需)。
email: 用户的电子邮件地址(可选)。
emailVerified:邮箱认证状态(可选)。
mobilePhoneNumber:手机号码(可选)。
mobilePhoneNumberVerified:手机号码的认证状态(可选)。
扩展用户类
很多时候,你的用户表还会有很多其他字段,如性别、年龄、头像等。那么,你需要对BmobUser类进行扩展,添加一些新的属性,我的扩张用户类如下所示:
public class MyUser extends BmobUser {
private static final long serialVersionUID = 1L;
private boolean loginState; //登录状态
private boolean sex; //false - male, true - female
private String nick_URL_NET; //头像,将图像上传至服务器后会返回URL 保存
private String nick_URL_LOCAL; //头像,将图像保存至本地 路径
public long time; //记录最近一次登录时间,自动登录保存1个星期
public boolean isLoginState() {
return loginState;
}
public void setLoginState(boolean loginState) {
this.loginState = loginState;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public String getNick_URL_NET() {
return nick_URL_NET;
}
public void setNick_URL_NET(String nick_URL_NET) {
this.nick_URL_NET = nick_URL_NET;
}
public String getNick_URL_LOCAL() {
return nick_URL_LOCAL;
}
public void setNick_URL_LOCAL(String nick_URL_LOCAL) {
this.nick_URL_LOCAL = nick_URL_LOCAL;
}
public MyUser() {
super();
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
@Override
public String toString() {
return "MyUser [loginState=" + loginState + ", sex=" + sex
+ ", nick_URL_NET=" + nick_URL_NET + ", nick_URL_LOCAL="
+ nick_URL_LOCAL + ", time=" + time + "]";
}
创建用户:
MyUser myUser = new MyUser();
注册用户:
这时分两种情况:用户有头像设置与没有头像设置;
若用户有对头像进行设置,在注册时先将头像文件上传至服务器,并将返回的服务器地址保存,再注册;而没有进行投向设置则直接注册,代码如下:
PublicData.bu.setSex(rb_female.isChecked() == true ? true:false);
PublicData.bu.setUsername(name);
PublicData.bu.setPassword(password);
final ProgressDialog progress = new ProgressDialog(this);
progress.setMessage("正在注册...");
progress.setCanceledOnTouchOutside(false);
progress.show();
//如果修改了头像
if(change_nick){
change_nick = false;
//将头像上传
String tmpPathImg = outImgPath+".jpg";
tmpNike = new File(tmpPathImg);
bmobFile = new BmobFile(tmpNike);
bmobFile.uploadblock(this, new UploadFileListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
String url = bmobFile.getFileUrl(RegsiterActivity.this);
Toast.makeText(getApplicationContext(), "上传文件成功:" + url, Toast.LENGTH_LONG).show();
PublicData.bu.setNick_URL_NET(url);
PublicData.bu.setNick_URL_LOCAL(outputUri.getPath());
UserInfo userInfo = new UserInfo(PublicData.bu.getUsername(),bmobFile,url);
saveInfo(userInfo);
register(PublicData.bu,progress);
}
@Override
public void onProgress(Integer arg0) {
// TODO Auto-generated method stub
}
@Override
public void onFailure(int arg0, String arg1) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "上传文件失败:" + arg1, Toast.LENGTH_LONG).show();
cancelDialog(progress);
}
});
}else{
PublicData.bu.setNick_URL_NET(PublicData.noNike);
PublicData.bu.setNick_URL_LOCAL(null);
register(PublicData.bu,progress);
}
private void register(final MyUser bu,final ProgressDialog progress) {
bu.signUp(getApplicationContext(), new SaveListener() {
@Override
public void onSuccess() {
Toast.makeText(getApplicationContext(), "注册成功!", Toast.LENGTH_LONG).show();
progress.dismiss();
PublicData.loginState = true;
bu.setLoginState(true);
bu.setTime(System.currentTimeMillis());
UserSharePreference sharePreference = new UserSharePreference(getApplicationContext());
sharePreference.saveMessage(bu);
release();
if(tmpNike.exists()){
tmpNike.delete();
}
finish();
}
@Override
public void onFailure(int arg0, String arg1) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "注册失败:"+arg1, Toast.LENGTH_LONG).show();
progress.dismiss();
bu.setLoginState(false);
}
});
}
/**
* 将用户信息上传至服务器,为了测试在服务器新建表,可不用此操作
* */
protected void saveInfo(final UserInfo userInfo) {
userInfo.save(getApplicationContext(), new SaveListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "创建数据成功:"+userInfo.getObjectId(),Toast.LENGTH_LONG ).show();
}
@Override
public void onFailure(int arg0, String arg1) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "-->创建数据失败:" + arg0+",msg = "+arg1,Toast.LENGTH_LONG ).show();
}
});
}
在此过程中遇到1个问题:
过于注重上传文件后将文件删除,导致将上传的BmobFile 删除早了,导致开始上传图片失败。原因还是对SDK不够熟悉,以后注意。
还遇到一个问题:
http://yuwenbin12345.blog.163.com/blog/static/438866520112105515245/
类似这个问题,我用的ProgressDialog 每次pd.show()时出现问题。
好了上两张图片:Android 登陆界面 和 服务器数据
下一章介绍登陆。