即时通讯(二)--用户登录(Android)

开头

这里我们使用的Bmob的手机号登录,所有就没有注册界面啦

思路如下

*** 登录页的逻辑
*   1.获取电话号码 如果不为空 点击发送验证码, 弹出验证框, 验证成功
*   2. 发送验证码, 发送按钮变成不可点击, 进行倒计时, 倒计时结束, 变成可点击 文字变成"发送"
*   3. 点击登录  获取手机号码和验证码   验证是否正确
*   4. 跳转到主页 获取用户类**

在进行写代码前,先来介绍下Bmob的给手机发送短信验证码,和如何使用短信验证码和手机进行登录

手机号码和短信验证码登录

1.先请求登录操作的短信验证码

/**
 * TODO template 如果是自定义短信模板,此处替换为你在控制台设置的自定义短信模板名称;如果没有对应的自定义短信模板,则使用默认短信模板,默认模板名称为空字符串""。
 *
 * TODO 应用名称以及自定义短信内容,请使用不会被和谐的文字,防止发送短信验证码失败。
 * phone 就是我们的手机号码
 * 通过这个方法,我们就可以先通过EditText获取用户输入的手机号,然后进行发送。
 */
BmobSMS.requestSMSCode(phone, "", new QueryListener<Integer>() {
    @Override
    public void done(Integer smsId, BmobException e) {
        if (e == null) {
            mTvInfo.append("发送验证码成功,短信ID:" + smsId + "\n");
        } else {
            mTvInfo.append("发送验证码失败:" + e.getErrorCode() + "-" + e.getMessage() + "\n");
        }
    }
});

2、然后进行手机号码和短信验证码登录:

/**
 * TODO 此API需要在用户已经注册并验证的前提下才能使用
 * phone: 就是用户的手机号码
 * code: 就是我们刚刚获取的短信验证码
 * 验证成功的话e==null,这里就可以写跳转到主页的逻辑。
 */
BmobUser.loginBySMSCode(phone, code, new LogInListener<BmobUser>() {
    @Override
    public void done(BmobUser bmobUser, BmobException e) {
        if (e == null) {
            mTvInfo.append("短信登录成功:" + bmobUser.getObjectId() + "-" + bmobUser.getUsername());
            startActivity(new Intent(UserLoginSmsActivity.this, UserMainActivity.class));
        } else {
            mTvInfo.append("短信登录失败:" + e.getErrorCode() + "-" + e.getMessage() + "\n");
        }
    }
});

废话不多说,直接上代码

1.获取电话号码 如果不为空 点击发送验证码, 弹出验证框, 验证成功

 private void sendSms() {
        //获取电话号码
        String phone = et_phone.getText().toString().trim();
        if(TextUtils.isEmpty(phone)){
            //如果电话号码为空 就弹出一个对话框
            Toast.makeText(this, R.string.text_login_phone_null, Toast.LENGTH_SHORT).show();
            return;
        }
        //如果电话号码不为空 发送验证码
        BmobManager.getInstance().requestSms(phone, new QueryListener<Integer>() {
            @Override
            public void done(Integer integer, BmobException e) {
                if(e == null){
                    Toast.makeText(LoginActivity.this, "验证码发送成功", Toast.LENGTH_SHORT).show();
                    btn_send_code.setEnabled(false);
                    //开始倒计时
                    mHandler.sendEmptyMessage(HANDLER_WHAT);
                }else{
                    Toast.makeText(LoginActivity.this, "请输入正确的手机号码", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
  1. 发送验证码, 发送按钮变成不可点击, 进行倒计时, 倒计时结束, 变成可点击 文字变成"发送"
    这里我使用的Handler进行倒计时
private Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(@NonNull Message msg) {
            switch (msg.what){
                case HANDLER_WHAT:
                    TIMER--;
                    btn_send_code.setText(TIMER + "s");
                    if(TIMER>0){
                        //继续发送延时Handler
                        mHandler.sendEmptyMessageDelayed(HANDLER_WHAT,1000);
                    }else {
                        //恢复按钮的状态
                        btn_send_code.setEnabled(true);
                        btn_send_code.setText("发送验证码");
                    }
                    break;
            }
            return true;
        }
    });
  1. 点击登录 获取手机号码和验证码 验证是否正确
 private void login() {
        final String phone = et_phone.getText().toString().trim();
        if(TextUtils.isEmpty(phone)){
            //如果电话号码为空 就弹出一个对话框
            Toast.makeText(this, R.string.text_login_phone_null, Toast.LENGTH_SHORT).show();
            return;
        }
        String code = et_code.getText().toString().trim();
        if(TextUtils.isEmpty(code)){
            //如果电话号码为空 就弹出一个对话框
            Toast.makeText(this, R.string.text_login_code_null, Toast.LENGTH_SHORT).show();
            return;
        }

        //显示Loding 登录提示框
        lodingView.show("正在登录....");
        //登录验证
        BmobManager.getInstance().loginSms(phone, code, new LogInListener<bUser>() {
            @Override
            public void done(bUser bUser, BmobException e) {
                if(e == null){
                    Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
                    //跳转到主页
                    startActivity(new Intent(LoginActivity.this, MainActivity.class));
                    finish();
                    //将电话号码保存在内部存储,方便用户下次登录
                 SpUtils.getInstance(LoginActivity.this).edit().putString(Constant.PHONE,phone).commit();
                    lodingView.hide();
                }else{
                    Toast.makeText(LoginActivity.this, "验证码错误", Toast.LENGTH_SHORT).show();
                    lodingView.hide();
                }
            }
        });
    }
  1. 跳转到主页 获取用户类 **
    其实获取用户类非常简单,Bmob专门有一个方法,可以获取当前登录的用户,后面我们在进行讲解

看到这里有的朋友就会很疑惑? 代码里面的BmobManager是什么东西?Bmob并没有这么一个方法呀!
其实BmobManager是我专门对Bmob里面的方法进行了一个封装

BmobManager的代码

package com.example.meet.bmob;

import android.content.Context;

import java.io.File;
import java.util.List;

import cn.bmob.v3.Bmob;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.BmobSMS;
import cn.bmob.v3.BmobUser;
import cn.bmob.v3.datatype.BmobFile;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.LogInListener;
import cn.bmob.v3.listener.QueryListener;
import cn.bmob.v3.listener.SaveListener;
import cn.bmob.v3.listener.UpdateListener;
import cn.bmob.v3.listener.UploadFileListener;

public class BmobManager {
    //Bmob id
    private  static  final  String BOMB_SDK_ID = "ec8769e694c092b196aeced3b72dd620";

    private  volatile static  BmobManager instance = null;


    public  BmobManager(){

    }

    public static  BmobManager getInstance(){
        if(instance == null){
            instance = new BmobManager();
        }
        return instance;
    }

    //初始化Bmob
    public  void initBmob(Context mContext){
        Bmob.initialize(mContext,BOMB_SDK_ID);
    }

    //发送验证码
    public  void requestSms(String phone,QueryListener<Integer> listener){
        BmobSMS.requestSMSCode(phone, "meet",listener);
    }

    //登录操作
    public  void loginSms(String phone, String code, LogInListener<bUser> logInListener){
        BmobUser.signOrLoginByMobilePhone(phone,code,logInListener);
    }

    //判断用户是否登录
    public  boolean isLogin(){
        return  BmobUser.isLogin();
    }

    //获取当前用户类
    public bUser getUser(){
        bUser currentUser = BmobUser.getCurrentUser(bUser.class);
        return currentUser;
    }

    public void uploadPhoto(final String nickName, File uploadFile, final uploadFileListener listener) {

        //获取当前用户对象
        final bUser user = getUser();

        //创建文件上传对象
        final BmobFile bmobFile = new BmobFile(uploadFile);
        bmobFile.uploadblock(new UploadFileListener() {
            @Override
            public void done(BmobException e) {
                if(e!= null){
                    //图片上传成功
                    //获取图片的url地址
//                    String url = bmobFile.getFileUrl();
                    //更新用户信息
                    user.setNickName(nickName);
//                    user.setPhoto(url);
                    user.setTokenNickName(nickName);
//                    user.setTokenPhoto(url);
                    user.update(new UpdateListener() {
                        @Override
                        public void done(BmobException e) {
                            if(e == null){
                                //更新用户成功
                                listener.uploadDone();
                            }else{
                                //更新用户失败
                                listener.uploadFail(e);
                            }
                        }
                    });
                }else{
                    //图片上传失败
                    listener.uploadFail(e);
                }
            }
        });
    }



    public   interface  uploadFileListener{
        void uploadDone();
        void uploadFail(BmobException e);
    }

    //通过电话号码查询用户
    public void PhoneQueryUser(String phone, FindListener<bUser> listener) {
        BaseQuery("mobilePhoneNumber",phone,listener);
    }

    //查询所有的联系人
    public void QueryAllUser(FindListener<bUser> listener) {
        BmobQuery<bUser> bmobQuery = new BmobQuery<>();
        bmobQuery.findObjects(listener);
    }

    //查询我的好友
    public  void QueryMyFriend(FindListener<Friend> listener){
        BmobQuery<Friend> bmobQuery = new BmobQuery<>();
        //只要user 等于当前用户的,那么查询出来的就是当前用户的好友
        bmobQuery.addWhereEqualTo("user",getUser());
        bmobQuery.findObjects(listener);
    }

    //通过id查询好友信息
    public  void QueryFriendById(String objectId,FindListener<bUser> listener){
        BmobQuery<bUser> bmobQuery = new BmobQuery<>();
        bmobQuery.addWhereEqualTo("objectId",objectId);
        bmobQuery.findObjects(listener);
    }

    //基础查询
    public  void BaseQuery(String key,String value,FindListener<bUser> listener){
        BmobQuery<bUser> bmobQuery = new BmobQuery<>();
        //添加查询的条件
        bmobQuery.addWhereEqualTo(key,value);
        bmobQuery.findObjects(listener);
    }

    //添加好友
    public  void AddFriend(bUser friendUser, SaveListener<String> saveListener){
        Friend friend = new Friend();
        friend.setUser(getUser());
        friend.setUser_friend(friendUser);
        friend.save(saveListener);

    }

    //根据id添加好友
    public  void AddFriend(String id, final SaveListener<String> saveListener){
        QueryFriendById(id, new FindListener<bUser>() {
            @Override
            public void done(List<bUser> list, BmobException e) {
                if(e==null){
                    if(list.size()>0){
                        bUser bUser = list.get(0);
                        AddFriend(bUser,saveListener);
                    }
                }
            }
        });
    }

    //查询当前用户所有好友
    public  void queryAllMyFriend(FindListener<Friend> listener){
        BmobQuery<Friend> bmobQuery = new BmobQuery<>();
        bmobQuery.addWhereEqualTo("user",getUser());
        bmobQuery.findObjects(listener);
    }
}

现在是不是知道了BmobManager的作用了。里面具体的方法,我们后面在讲解

用户登录就讲解到这里了,接下来是MainActivity的逻辑(也就是主页的逻辑)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值