Android 基于Bmob的聊天——用户登陆+将用户信息保存至本地

本文介绍如何使用Bmob实现用户登录功能,并详细解释了登录流程及代码实现。此外,还介绍了如何将用户的头像保存至本地,并利用SharePreference进行用户信息的持久化存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考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;
    }

这样就完成了 用户登陆,并将用户信息保存至本地,同时更新了注册里的用户信息保存。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值