参考Bmob官网上的登陆,完成自己的登陆
http://docs.bmob.cn/data/Android/b_developdoc/doc/index.html#登录
Bmob允许短信、邮件、用户名+密码登陆,这篇我采用的是用户名+密码的方式登陆,短信与邮件的方式将在后面文章中介绍。下图是用户登录流程:
代码如下:
MyUser user = new MyUser();
user.setUsername(name);
user.setPassword(password);
user.login(mContext, new SaveListener() {
@Override
public void onSuccess() {
//通过BmobUser user = BmobUser.getCurrentUser(context)获取登录成功后的本地用户信息
//如果是自定义用户对象MyUser,可通过User getUser = BmobUser.getCurrentUser(getApplicationContext(), User.class);
pd.dismiss();
PublicData.loginState = true;
Toast.makeText(mContext, "登录成功!", Toast.LENGTH_LONG).show();
PublicData.bu = BmobUser.getCurrentUser(mContext,MyUser.class);//获取自定义用户信息
Message msg = new Message();
msg.what = LOGIN_SUCEESS;
handle.sendMessage(msg);
}
@Override
public void onFailure(int code, String msg) {
Toast.makeText(mContext, "登录失败: "+msg, Toast.LENGTH_LONG).show();
pd.dismiss();
}
});
if(msg.what == LOGIN_SUCEESS){
PublicData.bu.setLoginState(true);
PublicData.bu.setTime(System.currentTimeMillis());
if(!PublicData.bu.getNick_URL_NET().equals(PublicData.noNike)){
String avatarPath = PublicData.LocFileNick.getPath() + getFileName(PublicData.bu.getNick_URL_NET());
PublicData.bu.setNick_URL_LOCAL(avatarPath);
System.out.println("PublicData.bu info : \n"+PublicData.bu.toString());
File fileTmp = new File(PublicData.bu.getNick_URL_LOCAL());
if(!fileTmp.exists()){
BmobFile bmobfile =new BmobFile(getFileName(PublicData.bu.getNick_URL_NET()),"",PublicData.bu.getNick_URL_NET());
downLoadAvatar(bmobfile);
}
}else {
PublicData.bu.setNick_URL_LOCAL(PublicData.noNike);
}
goChat(true);
}
private void downLoadAvatar(BmobFile file){
final File saveFile = new File(PublicData.LocFileNick, file.getFilename());
file.download(mContext, saveFile, new DownloadFileListener() {
@Override
public void onSuccess(String arg0) {
Toast.makeText(mContext, "下载头像成功!", Toast.LENGTH_LONG).show();
System.out.println("saveFile.getPath(): "+saveFile.getPath());
PublicData.bu.setNick_URL_LOCAL(saveFile.getPath());
System.out.println("PublicData.bu info : \n"+PublicData.bu.toString());
}
@Override
public void onFailure(int arg0, String arg1) {
Toast.makeText(mContext, "下载头像失败:"+arg1, Toast.LENGTH_LONG).show();
}
});
}
本工程设置是将用户头像保存到本地指定的文件夹下,按一定命名方法,这样就不用每次从服务器上取。
所以每次获取用户信息后,现在本地查找是否存在该用户头像,若不存在则下载。(注:若更改用户头像后,也要更新该图片)
图片下载:
Bmob官方给出下载文件方法:
http://docs.bmob.cn/data/Android/b_developdoc/doc/index.html#下载文件
命名规则:根据服务器地址保存的文件名
这时需要根据网址获取文件名,代码如下:
ublic String getFileName(String pathandname){
int start=pathandname.lastIndexOf("/");
//int end=pathandname.lastIndexOf(".");
if(start!=-1 && end!=-1){
return pathandname.substring(start+1,end);
}else{
return null;
}
}
以上代码即可完成用户登陆与头像保存,但是不希望每次都重新登陆,这时我用到了SharePreference 对用户信息进行保存,之前在用户里有time参数,记录用户最近一次登陆时间,如果距离上次登陆时间超过7天,则需要再次输入密码登陆否则直接登陆至聊天页面。下面是UserSharePreference 类,代码如下:
public class UserSharePreference {
private Context context;
private String fileName = "userInfo";
public UserSharePreference(Context context) {
super();
this.context = context;
}
public boolean saveMessage(MyUser loginInfo){
MyUser preInfo = getLoginInfo();
boolean flag = false;
SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
//对数据进行编辑
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("LoginSta", loginInfo.isLoginState()); //登录状态
editor.putString("userName", loginInfo.getUsername()); //用户名
editor.putLong("preTime", loginInfo.getTime());
editor.putBoolean("sex", loginInfo.isSex());
editor.putString("nickUrl", loginInfo.getNick_URL_NET());
editor.putString("nickLocal", loginInfo.getNick_URL_LOCAL());
flag = editor.commit();
return flag;
}
public MyUser getLoginInfo(){
MyUser loginInfo = new MyUser();
SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
//对数据进行读取
loginInfo.setLoginState(sharedPreferences.getBoolean("LoginSta", false));
loginInfo.setUsername(sharedPreferences.getString("userName", PublicData.noLogin));
loginInfo.setTime(sharedPreferences.getLong("preTime", 0));
loginInfo.setSex(sharedPreferences.getBoolean("sex", false));
loginInfo.setNick_URL_NET(sharedPreferences.getString("nickUrl", PublicData.noNike));
loginInfo.setNick_URL_LOCAL(sharedPreferences.getString("nickLocal", PublicData.noNike));
return loginInfo;
}
}
这样每次执行程序时,首先读取UserSharePreference里面的用户信息,并进行判断,代码如下:
private MyUser getUserInfo() {
UserSharePreference userSharePreference = new UserSharePreference(getApplicationContext());
MyUser user = userSharePreference.getLoginInfo();
long timeNow = System.currentTimeMillis();
long timePre = user.getTime();
if(timeNow - timePre > 604800000){
PublicData.loginState = false;
user.setLoginState(false);
}
else{
user.setTime(timeNow);
boolean savaSta = userSharePreference.saveMessage(user);
System.out.println("更新保存用户信息时间: "+savaSta);
System.out.println("从 UserSharePreference 里获取到的用户信息:"+user.toString());
}
return user;
}
这样就完成了 用户登陆,并将用户信息保存至本地,同时更新了注册里的用户信息保存。