开头
这里我们使用的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();
}
}
});
}
- 发送验证码, 发送按钮变成不可点击, 进行倒计时, 倒计时结束, 变成可点击 文字变成"发送"
这里我使用的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;
}
});
- 点击登录 获取手机号码和验证码 验证是否正确
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();
}
}
});
}
- 跳转到主页 获取用户类 **
其实获取用户类非常简单,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的逻辑(也就是主页的逻辑)