首先是基于Bmob 平台,采用MVP 开发模式。效果见图:
下面一 一给出源码:
MVP 目录结构:
登录/注册的Activity:
package com.example.yangzi.mvp_dev.ui.activity;
import android.content.Context;
import android.content.Intent;
import android.support.design.widget.TextInputLayout;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.example.yangzi.mvp_dev.R;
import com.example.yangzi.mvp_dev.base.BaseActivity;
import com.example.yangzi.mvp_dev.bean.remote.MyUser;
import com.example.yangzi.mvp_dev.mvp.presenter.Imp.UserLogPresenterImp;
import com.example.yangzi.mvp_dev.mvp.presenter.UserLogPresenter;
import com.example.yangzi.mvp_dev.mvp.view.UserLogView;
import com.example.yangzi.mvp_dev.utils.LogUtils;
import com.example.yangzi.mvp_dev.utils.ProgressUtils;
import com.example.yangzi.mvp_dev.utils.RegexUtils;
import com.example.yangzi.mvp_dev.utils.SnackbarUtils;
import com.example.yangzi.mvp_dev.utils.StringUtils;
import com.example.yangzi.mvp_dev.utils.ToastUtils;
import com.example.yangzi.mvp_dev.widget.OwlView;
import com.example.yangzi.mvp_dev.widget.VerifyCodeButton;
import java.util.HashMap;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import butterknife.OnFocusChange;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.BmobSMS;
import cn.bmob.v3.BmobUser;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.QueryListener;
import cn.bmob.v3.listener.UpdateListener;
import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;
import cn.smssdk.gui.RegisterPage;
/**
* Created by linzihahaha on 2018/12/8.
*/
public class LoginActivity extends BaseActivity implements UserLogView {
@BindView(R.id.owl_view)
OwlView mOwlView;
@BindView(R.id.login_et_username)
TextInputLayout usernameET;
@BindView(R.id.login_et_password)
EditText passwordET;
@BindView(R.id.login_tv_forget)
TextView forget;
@BindView(R.id.login_et_rpassword)
EditText rpasswordET;
@BindView(R.id.login_et_phone)
TextInputLayout phone;
@BindView(R.id.login_et_email)
TextInputLayout email;
@BindView(R.id.login_get_code)
TextInputLayout getCode;
@BindView(R.id.login_tv_sign)
TextView signTV;
@BindView(R.id.login_tv_phone)
TextView loginphoneTV;
@BindView(R.id.btn_login_get_code)
VerifyCodeButton getcodeBtn;
@BindView(R.id.login_btn_login)
Button loginBtn;
private EditText mEdtName;
private EditText mEdtPhone;
private EditText mEdtEmail;
private EditText mEdtCode;
private EditText mEdtPassword;
private EditText mEdtrPassword;
//是否是登陆操作
private boolean isLogin = true;
private boolean isLoginbyphone = false;
private UserLogPresenter userLogPresenter;
@Override
protected int getLayout() {
return R.layout.activity_user_login;
}
@Override
protected void initEventAndData() {
userLogPresenter = new UserLogPresenterImp(this);
mEdtName = usernameET.getEditText();
mEdtPhone = phone.getEditText();
mEdtEmail=email.getEditText();
mEdtCode = getCode.getEditText();
mEdtName.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
usernameET.setErrorEnabled(false);
}
@Override
public void afterTextChanged(Editable editable) {
}
});
mEdtPhone.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String phone = charSequence.toString();
if (!RegexUtils.checkPhone(phone)) {
mEdtPhone.setError("请输入正确的手机号");
} else {
getCode.setErrorEnabled(false);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
mEdtEmail.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String phone = charSequence.toString();
if (!RegexUtils.checkPhone(phone)) {
mEdtPhone.setError("请输入正确的邮箱");
} else {
getCode.setErrorEnabled(false);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
mEdtCode.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String code = charSequence.toString();
if (!RegexUtils.checkCode(code)) {
getCode.setError("请输入正确的验证码");
} else {
getCode.setErrorEnabled(false);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
//监听密码输入框的聚焦事件
@OnFocusChange({R.id.login_et_password,R.id.login_et_rpassword})
public void onFocusChange(View view, boolean b) {
if (b) {
mOwlView.open();
} else {
mOwlView.close();
}
}
/**
* 监听点击事件
*
* @param view
*/
@OnClick({R.id.btn_login_get_code,R.id.login_tv_sign, R.id.login_btn_login, R.id.login_tv_forget,R.id.login_tv_phone})
protected void onClick(View view) {
switch (view.getId()) {
case R.id.btn_login_get_code: // 获取验证码
getCode();
break;
case R.id.login_btn_login: //button
if (isLogin) {
login(); //登陆
} else {
sign(); //注册
}
break;
case R.id.login_tv_forget: //忘记密码
startActivity(new Intent(mContext, ForgetPasswordActivity.class));
break;
case R.id.login_tv_sign: //sign
if (!isLogin) {
//置换注册界面
if (!isLoginbyphone) {
loginBtn.setText("登录");
signTV.setText("邮箱注册");
loginphoneTV.setText("验证码注册");
usernameET.setVisibility(View.VISIBLE);
passwordET.setVisibility(View.VISIBLE);
rpasswordET.setVisibility(View.GONE);
phone.setVisibility(View.GONE);
email.setVisibility(View.GONE);
getCode.setVisibility(View.GONE);
forget.setVisibility(View.VISIBLE);
getcodeBtn.setVisibility(View.GONE);
usernameET.setHint("用户名/手机号/邮箱");
}else{
loginBtn.setText("验证");
signTV.setText("邮箱注册");
loginphoneTV.setText("密码登录");
usernameET.setVisibility(View.GONE);
passwordET.setVisibility(View.GONE);
rpasswordET.setVisibility(View.GONE);
phone.setVisibility(View.VISIBLE);
email.setVisibility(View.GONE);
getCode.setVisibility(View.VISIBLE);
forget.setVisibility(View.GONE);
getcodeBtn.setVisibility(View.VISIBLE);
usernameET.setHint("用户名");
}
} else {
//置换登陆界面
loginBtn.setText("注册");
signTV.setText("返回登录");
usernameET.setVisibility(View.VISIBLE);
passwordET.setVisibility(View.VISIBLE);
rpasswordET.setVisibility(View.VISIBLE);
phone.setVisibility(View.GONE);
email.setVisibility(View.VISIBLE);
getCode.setVisibility(View.GONE);
forget.setVisibility(View.GONE);
getcodeBtn.setVisibility(View.GONE);
usernameET.setHint("用户名");
}
isLogin = !isLogin;
break;
case R.id.login_tv_phone: //手机号验证码登录
isLogin=true;
if (isLoginbyphone) {
loginBtn.setText("登录");
signTV.setText("邮箱注册");
loginphoneTV.setText("验证码注册");
usernameET.setVisibility(View.VISIBLE);
passwordET.setVisibility(View.VISIBLE);
rpasswordET.setVisibility(View.GONE);
phone.setVisibility(View.GONE);
email.setVisibility(View.GONE);
getCode.setVisibility(View.GONE);
forget.setVisibility(View.VISIBLE);
getcodeBtn.setVisibility(View.GONE);
usernameET.setHint("用户名/手机号/邮箱");
}else{
loginBtn.setText("验证");
signTV.setText("邮箱注册");
loginphoneTV.setText("密码登录");
usernameET.setVisibility(View.GONE);
passwordET.setVisibility(View.GONE);
rpasswordET.setVisibility(View.GONE);
phone.setVisibility(View.VISIBLE);
email.setVisibility(View.GONE);
getCode.setVisibility(View.VISIBLE);
forget.setVisibility(View.GONE);
getcodeBtn.setVisibility(View.VISIBLE);
usernameET.setHint("用户名");
}
isLoginbyphone=!isLoginbyphone;
break;
default:
break;
}
}
private void getCode() {
String username = mEdtName.getText().toString();
String password = passwordET.getText().toString();
String rpassword = rpasswordET.getText().toString();
final String phonenumber = mEdtPhone.getText().toString();
if (phonenumber.length() == 0) {
Toast.makeText(mContext, "请输入手机号", Toast.LENGTH_SHORT).show();
return;
}
BmobQuery<MyUser> query = new BmobQuery<MyUser>();
query.addWhereEqualTo("mobilePhoneNumber", phonenumber);
query.setLimit(1);
query.findObjects(new FindListener<MyUser>() {
@Override
public void done(List<MyUser> list, BmobException e) {
if (e == null) {
if (list.size()>0)
Toast.makeText(mContext, "手机号已注册,请返回登录", Toast.LENGTH_SHORT).show();
else
requestSMScodeFromBmob(phonenumber);
}
}
});
// 请求验证码,其中country表示国家代码,如“86”;phone表示手机号码,如“13800138000”
//Toast.makeText(mContext, "发送验证码请求" + username, Toast.LENGTH_SHORT).show();
//SMSSDK.getVerificationCode("86",username);
}
/**
* 请求验证码
* @param phone_number 手机号
* @param template_name 验证码模板名称
* @param listener 回调
*/
/**
* TODO template 如果是自定义短信模板,此处替换为你在控制台设置的自定义短信模板名称;如果没有对应的自定义短信模板,则使用默认短信模板。
*/
public void requestSMScodeFromBmob(String phone) {
getcodeBtn.start();
BmobSMS.requestSMSCode(phone, "register", new QueryListener<Integer>() {
@Override
public void done(Integer smsId, BmobException e) {
if (e == null) {
Toast.makeText(mContext, "发送验证码成功,短信ID:" + smsId + "\n", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext, "发送验证码失败:" + e.getErrorCode() + "-" + e.getMessage() + "\n", Toast.LENGTH_SHORT).show();
}
}
});
}
/**
* 执行登陆动作
*/
public void login() {
if(!isLoginbyphone) {
String username = mEdtName.getText().toString();
String password = passwordET.getText().toString();
if (username.length() == 0 || password.length() == 0 ) {
SnackbarUtils.show(mContext, "输入为空或格式不正确");
return;
}
ProgressUtils.show(this, "正在登陆...");
userLogPresenter.login(username, password);
}else{
String phonenumber = mEdtPhone.getText().toString();
String code = mEdtCode.getText().toString();
if (phonenumber.length() == 0 || !RegexUtils.checkPhone(phonenumber)) {
Toast.makeText(mContext, "请输入正确手机号", Toast.LENGTH_SHORT).show();
return;
}
if (code.length() == 0|| !RegexUtils.checkCode(code)) {
Toast.makeText(mContext, "请输入正确验证码", Toast.LENGTH_SHORT).show();
return;
}
ProgressUtils.show(this, "正在验证...");
veriflySMSCode(phonenumber,code);
}
}
/**
* 执行注册动作
*/
public void sign() {
String username = mEdtName.getText().toString();
String password = passwordET.getText().toString();
String rpassword = rpasswordET.getText().toString();
String email= mEdtEmail.getText().toString();
String phone = mEdtPhone.getText().toString();
if ( username.length() == 0 || password.length() == 0 || rpassword.length() == 0) {
SnackbarUtils.show(mContext, "请填写必要信息");
return;
}
if (!RegexUtils.checkUserName(username)) {
SnackbarUtils.show(mContext, "请输入正确用户名 6到18位字母开头与字数组合");
return;
}
//ToastUtils.show(mContext,"xxxx"+password+"||"+rpassword);
if (!password.equals(rpassword)|| !RegexUtils.checkPassword(password)) {
SnackbarUtils.show(mContext, "两次密码不一致");
return;
}
ProgressUtils.show(this, "正在注册...");
if (!isLogin && !isLoginbyphone) {
emailVerify(email);
userLogPresenter.signup(username,password,email);
}else
userLogPresenter.signup(username,password,phone);
}
/**
* 发送验证邮件
*/
private void emailVerify(final String email) {
MyUser.requestEmailVerify(email, new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null) {
ToastUtils.show(mContext, "请求验证邮件成功,请到" + email + "邮箱中进行激活账户。");
} else {
Log.e("BMOB", e.toString());
ToastUtils.show(mContext, "请求验证邮件失败," + e.getMessage());
}
}
});
}
private void veriflySMSCode(final String phonenumber,final String code) {
BmobSMS.verifySmsCode(phonenumber, code, new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null) {
ToastUtils.show(mContext, "验证码验证成功");
ProgressUtils.dismiss();
if(phone.isShown())
{
//ToastUtils.show(mContext, "该手机号第一次登录,请设置用户名密码");
isLogin=false;
loginBtn.setText("注册");
loginphoneTV.setText("密码登录");
usernameET.setVisibility(View.VISIBLE);
passwordET.setVisibility(View.VISIBLE);
rpasswordET.setVisibility(View.VISIBLE);
phone.setVisibility(View.GONE);
getCode.setVisibility(View.GONE);
forget.setVisibility(View.VISIBLE);
getcodeBtn.setVisibility(View.GONE);
usernameET.setHint("用户名");
}
} else {
ProgressUtils.dismiss();
ToastUtils.show(mContext, "验证码有误"+e.getErrorCode() + "-" + e.getMessage());
}
}
});
}
@Override
public void loadDataSuccess(MyUser tData) {
ProgressUtils.dismiss();
if (isLogin) {
ToastUtils.show(mContext, "登录成功");
setResult(RESULT_OK, new Intent());
finish();
}else {
ToastUtils.show(mContext, "注册成功");
if (tData.getEmail()==null){
setResult(RESULT_OK, new Intent());
finish();
}else {
//emailVerify(tData.getEmail());
SnackbarUtils.show(mContext, "请先登陆邮箱验证后登陆");
}
}
}
@Override
public void loadDataError(Throwable throwable) {
ProgressUtils.dismiss();
SnackbarUtils.show(mContext, throwable.getMessage());
Log.v(LogUtils.filename(new Exception()),LogUtils.funAndLine(new Exception())+throwable.getMessage());
}
}
用户信息展示Activity:
package com.example.yangzi.mvp_dev.ui.activity;
import android.Manifest;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.example.yangzi.mvp_dev.R;
import com.example.yangzi.mvp_dev.base.BaseActivity;
import com.example.yangzi.mvp_dev.bean.remote.MyUser;
import com.example.yangzi.mvp_dev.common.Constants;
import com.example.yangzi.mvp_dev.mvp.presenter.Imp.UserInfoPresenterImp;
import com.example.yangzi.mvp_dev.mvp.presenter.UserInfoPresenter;
import com.example.yangzi.mvp_dev.mvp.view.UserInfoView;
import com.example.yangzi.mvp_dev.utils.ImageUtils;
import com.example.yangzi.mvp_dev.utils.LogUtils;
import com.example.yangzi.mvp_dev.utils.ProgressUtils;
import com.example.yangzi.mvp_dev.utils.SnackbarUtils;
import com.example.yangzi.mvp_dev.utils.StringUtils;
import com.example.yangzi.mvp_dev.widget.CommonItemLayout;
import java.io.File;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.datatype.BmobFile;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.UpdateListener;
import cn.bmob.v3.listener.UploadFileListener;
import cn.smssdk.gui.util.Const;
/**
* Created by linzihahaha on 2018/12/24.
* 用户信息管理中心
*/
public class UserInfoActivity extends BaseActivity implements UserInfoView {
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.rlt_update_icon)
RelativeLayout iconRL;
@BindView(R.id.img_icon)
ImageView iconIv;
@BindView(R.id.cil_username)
CommonItemLayout usernameCL;
@BindView(R.id.cil_sex)
CommonItemLayout sexCL;
@BindView(R.id.cil_phone)
CommonItemLayout phoneCL;
@BindView(R.id.cil_email)
CommonItemLayout emailCL;
private UserInfoPresenter presenter;
//选择图片来源
private AlertDialog iconDialog;
private AlertDialog genderDialog;
private AlertDialog phoneDialog;
private AlertDialog emailDialog;
protected static final int CHOOSE_PICTURE = 0;
protected static final int TAKE_PICTURE = 1;
protected static final int GENDER_MAN = 0;
protected static final int GENDER_FEMALE = 1;
private static final int CROP_SMALL_PICTURE = 2;
//图片路径
protected static Uri tempUri = null;
@Override
protected int getLayout() {
return R.layout.activity_user_info;
}
@Override
protected void initEventAndData() {
presenter = new UserInfoPresenterImp(this);
presenter.showUserInfor(toolbar,currentUser);
}
@Override
public void loadDataSuccess(MyUser tData) {
ProgressUtils.dismiss();
}
@Override
public void loadDataError(Throwable throwable) {
ProgressUtils.dismiss();
SnackbarUtils.show(mContext, throwable.getMessage());
}
@Override
public void showUserInfor(Toolbar toolbar, MyUser user) {
//初始化Toolbar
toolbar.setTitle("账户");
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//返回消息更新上个Activity数据
setResult(RESULT_OK, new Intent());
finish();
}
});
if (currentUser != null) {
//加载到布局中
//加载当前头像
Glide.with(mContext).load(currentUser.getImage()).into(iconIv);
usernameCL.setRightText(currentUser.getUsername());
sexCL.setRightText(currentUser.getGender());
phoneCL.setRightText(currentUser.getMobilePhoneNumber());
emailCL.setRightText(currentUser.getEmail());
}
}
/**
* 监听点击事件
*
* @param view
*/
@OnClick({R.id.rlt_update_icon, R.id.cil_username,
R.id.cil_sex, R.id.cil_phone, R.id.cil_email})
public void onViewClicked(final View view) {
switch (view.getId()) {
case R.id.rlt_update_icon: //头像
// showIconDialog();
Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);
openAlbumIntent.setType("image/*");
startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);
break;
case R.id.cil_username: //用户名
SnackbarUtils.show(mContext, "江湖人行不更名,坐不改姓!");
break;
case R.id.cil_sex: //性别
showGenderDialog();
break;
case R.id.cil_phone: //电话修改
showPhoneDialog();
break;
case R.id.cil_email: //邮箱修改
showMailDialog();
break;
default:
break;
}
}
/**
* 更新用户数据
*/
public void doUpdate() {
if (currentUser == null)
return;
Log.v(LogUtils.filename(new Exception()),LogUtils.funAndLine(new Exception())+"doUpdate");
ProgressUtils.show(UserInfoActivity.this, "正在修改...");
presenter.update(currentUser);
}
/**
* 显示选择性别对话框
*/
public void showGenderDialog() {
if (genderDialog == null) {
genderDialog = new AlertDialog.Builder(this).setItems(new String[]{"男", "女"},
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case GENDER_MAN: // 男性
currentUser.setGender("男");
doUpdate();
break;
case GENDER_FEMALE: // 女性
currentUser.setGender("女");
doUpdate();
break;
}
sexCL.setRightText(currentUser.getGender());
}
}).create();
}
if (!genderDialog.isShowing()) {
genderDialog.show();
}
}
/**
* 显示更换电话对话框
*/
public void showPhoneDialog() {
final EditText editText = new EditText(mContext);
String phone = currentUser.getMobilePhoneNumber();
if (phone != null) {
SnackbarUtils.show(mContext, "已绑定,可进入设置更换!");
return;
}
if (phoneDialog == null) {
phoneDialog = new AlertDialog.Builder(this)
.setTitle("绑定手机号")
.setMessage("请输入新手机号")
.setView(editText)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
final String input = editText.getText().toString();
if (input.equals("")) {
Toast.makeText(getApplicationContext(), "内容不能为空!" + input,
Toast.LENGTH_SHORT).show();
} else {
if (StringUtils.checkPhoneNumber(input)) {
BmobQuery<MyUser> query = new BmobQuery<MyUser>();
query.addWhereEqualTo("mobilePhoneNumber", input);
query.setLimit(1);
query.findObjects(new FindListener<MyUser>() {
@Override
public void done(List<MyUser> list, BmobException e) {
if (e == null) {
if (list.size()>0)
Toast.makeText(mContext, "手机号已注册!", Toast.LENGTH_SHORT).show();
else{
verifyPhone(Constants.VERI_ADD_PHONE,input);
}
}
}
});
} else {
Toast.makeText(UserInfoActivity.this,
"请输入正确的电话号码", Toast.LENGTH_LONG).show();
}
}
}
})
.setNegativeButton("取消", null)
.create();
}
if (!phoneDialog.isShowing()) {
phoneDialog.show();
}
}
/*
*手机号码验证
*/
private void verifyPhone(int index,String input) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("phoneNumber",input);
bundle.putString("index",""+index);
intent.putExtras(bundle);
intent.setClass(this, VerifyPhoneActivity.class);
startActivityForResult(intent,index);
}
/**
* 显示更换邮箱对话框
*/
public void showMailDialog() {
final EditText emailEditText = new EditText(UserInfoActivity.this);
emailEditText.setText(currentUser.getEmail());
String title = "添加邮箱";
if(currentUser.getEmail()!=null) {
title = "更换邮箱";
//将光标移至文字末尾
emailEditText.setSelection(currentUser.getEmail().length());
}
if (emailDialog == null) {
emailDialog = new AlertDialog.Builder(this)
.setTitle(title)
.setView(emailEditText)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
final String input = emailEditText.getText().toString();
if (input.equals("")) {
Toast.makeText(getApplicationContext(), "内容不能为空!" + input,
Toast.LENGTH_SHORT).show();
} else {
if (StringUtils.checkEmail(input)) {
currentUser.setEmail(input);
BmobQuery<MyUser> query = new BmobQuery<MyUser>();
query.addWhereEqualTo("mobilePhoneNumber", input);
query.setLimit(1);
query.findObjects(new FindListener<MyUser>() {
@Override
public void done(List<MyUser> list, BmobException e) {
if (e == null) {
if (list.size()>0)
Toast.makeText(mContext, "邮箱已注册!", Toast.LENGTH_SHORT).show();
else{
//Toast.makeText(mContext, "请登录邮箱激活!", Toast.LENGTH_SHORT).show();
emailCL.setRightText(input);
doUpdate();
}
}
}
});
} else {
Toast.makeText(UserInfoActivity.this,
"请输入正确的邮箱格式", Toast.LENGTH_LONG).show();
}
}
}
})
.setNegativeButton("取消", null)
.create();
}
if (!emailDialog.isShowing()) {
emailDialog.show();
}
}
/**
* 监听Activity返回结果
*
* @param requestCode
* @param resultCode
* @param intent
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case TAKE_PICTURE:
startPhotoZoom(tempUri); // 开始对图片进行裁剪处理
break;
case CHOOSE_PICTURE:
startPhotoZoom(intent.getData()); // 开始对图片进行裁剪处理
break;
case CROP_SMALL_PICTURE:
if (intent != null) {
setImageToView(intent); // 让刚才选择裁剪得到的图片显示在界面上
}
break;
case Constants.VERI_ADD_PHONE :
Log.v(LogUtils.filename(new Exception()),LogUtils.funAndLine(new Exception())+intent.getStringExtra("phone"));
//Toast.makeText(mContext, "手机绑定成功", Toast.LENGTH_SHORT).show();
currentUser.setMobilePhoneNumber(intent.getStringExtra("phone"));
phoneCL.setRightText(intent.getStringExtra("phone"));
doUpdate();
break;
}
}
}
/**
* 监听Back键按下事件,方法2:
* 注意:
* 返回值表示:是否能完全处理该事件
* 在此处返回false,所以会继续传播该事件.
* 在具体项目中此处的返回值视情况而定.
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK))
setResult(RESULT_OK, new Intent());
return super.onKeyDown(keyCode, event);
}
/**
* 拍照
*/
private void takePicture() {
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (Build.VERSION.SDK_INT >= 23) {
// 需要申请动态权限
int check = ContextCompat.checkSelfPermission(this, permissions[0]);
// 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
if (check != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
Intent openCameraIntent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory(), "image.jpg");
//判断是否是AndroidN以及更高的版本
if (Build.VERSION.SDK_INT >= 24) {
openCameraIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
tempUri = FileProvider.getUriForFile(UserInfoActivity.this,
"com.copasso.cocobill.fileProvider", file);
} else {
tempUri = Uri.fromFile(new File(Environment
.getExternalStorageDirectory(), "image.jpg"));
}
// 指定照片保存路径(SD卡),image.jpg为一个临时文件,每次拍照后这个图片都会被替换
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
startActivityForResult(openCameraIntent, TAKE_PICTURE);
}
/**
* 裁剪图片方法实现
*
* @param uri
*/
protected void startPhotoZoom(Uri uri) {
if (uri == null) {
Log.i("tag", "The uri is not exist.");
}
tempUri = uri;
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// 设置裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, CROP_SMALL_PICTURE);
}
/**
* 保存裁剪之后的图片数据
*
* @param data
*/
protected void setImageToView(Intent data) {
Bundle extras = data.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
photo = ImageUtils.toRoundBitmap(photo); // 这个时候的图片已经被处理成圆形的了
iconIv.setImageBitmap(photo);
uploadPic(photo);
}
}
/**
* 保存头像并上传服务器
*
* @param bitmap
*/
private void uploadPic(Bitmap bitmap) {
// 上传至服务器
// 可以在这里把Bitmap转换成file,然后得到file的url,做文件上传操作
// 注意这里得到的图片已经是圆形图片了
// bitmap是没有做个圆形处理的,但已经被裁剪了
String imagename = currentUser.getObjectId() + "_" + String.valueOf(System.currentTimeMillis());
String imagePath = ImageUtils.savePhoto(bitmap, Environment
.getExternalStorageDirectory().getAbsolutePath(), imagename + ".png");
if (imagePath != null) {
final BmobFile bmobFile = new BmobFile(new File(imagePath));
bmobFile.uploadblock(new UploadFileListener() {
@Override
public void done(BmobException e) {
if (e==null) {
MyUser newUser=new MyUser();
newUser.setImage(bmobFile.getFileUrl());
newUser.update(currentUser.getObjectId(),new UpdateListener() {
@Override
public void done(BmobException e) {
if (e!=null)
Log.i(TAG,e.getMessage());
}
});
}else{
Log.i(TAG,e.getMessage());
}
}
});
}
}
/**
* 权限请求
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
} else {
// 没有获取 到权限,从新请求,或者关闭app
Toast.makeText(this, "需要存储权限", Toast.LENGTH_SHORT).show();
}
}
}
setting 的activity:
package com.example.yangzi.mvp_dev.ui.activity;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.design.widget.TextInputLayout;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.example.yangzi.mvp_dev.R;
import com.example.yangzi.mvp_dev.base.BaseActivity;
import com.example.yangzi.mvp_dev.bean.remote.MyUser;
import com.example.yangzi.mvp_dev.common.Constants;
import com.example.yangzi.mvp_dev.utils.GlideCacheUtil;
import com.example.yangzi.mvp_dev.utils.LogUtils;
import com.example.yangzi.mvp_dev.utils.ProgressUtils;
import com.example.yangzi.mvp_dev.utils.SnackbarUtils;
import com.example.yangzi.mvp_dev.utils.ToastUtils;
import com.example.yangzi.mvp_dev.widget.CommonItemLayout;
import butterknife.BindView;
import butterknife.OnClick;
import cn.bmob.v3.BmobUser;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.UpdateListener;
/**
* Created by linzihahaha on 2018/12/30.
*/
public class SettingActivity extends BaseActivity {
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.cil_change)
CommonItemLayout changeCL;
@BindView(R.id.cil_forget)
CommonItemLayout forgetCL;
@BindView(R.id.cil_store)
CommonItemLayout storeCL;
@BindView(R.id.cil_sort)
CommonItemLayout sortCL;
@BindView(R.id.cil_pay)
CommonItemLayout payCL;
@BindView(R.id.cil_export)
CommonItemLayout exportCL;
private AlertDialog pwDialog;
private AlertDialog cacheDialog;
@Override
protected int getLayout() {
return R.layout.activity_setting;
}
@Override
protected void initEventAndData() {
//初始化Toolbar
toolbar.setTitle("设置");
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//返回消息更新上个Activity数据
//setResult(RESULT_OK, new Intent());
finish();
}
});
storeCL.setRightText(GlideCacheUtil.getInstance().getCacheSize(mContext));
}
/**
* 监听点击事件
* @param view*/
@OnClick({R.id.cil_changePhone,R.id.cil_forget,R.id.cil_change,R.id.cil_store,
R.id.cil_sort,R.id.cil_pay,R.id.cil_export,R.id.cil_aboutus})
public void onViewClicked(final View view) {
switch (view.getId()) {
case R.id.cil_changePhone:
verifyPhone(Constants.VERI_CHANGE_PHONE);
break;
case R.id.cil_change: //修改密码
verifyPhone(Constants.VERI_CHANGE_PWD);
break;
case R.id.cil_forget: //忘记密码
// startActivity(new Intent(this,ForgetPasswordActivity.class));
showForgetPwDialog();
break;
case R.id.cil_store: //缓存
showCacheDialog();
break;
case R.id.cil_aboutus:
startActivity(new Intent(this, AboutActivity.class));
break;
default:
break;
}
}
private void verifyPhone(int index) {
if (!MyUser.isLogin()) {
Toast.makeText(getApplicationContext(), "请先登录!",
Toast.LENGTH_SHORT).show();
return;
}
String phonenunber=currentUser.getMobilePhoneNumber();
if (phonenunber==null)
{
Toast.makeText(getApplicationContext(), "请先绑定手机号!" ,
Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.putExtra("phoneNumber",phonenunber);
intent.putExtra("index",""+index);
intent.setClass(this, VerifyPhoneActivity.class);
startActivityForResult(intent,index);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.VERI_CHANGE_PWD && resultCode == Activity.RESULT_OK) {
showChangePwdDialog();
}else if (requestCode == Constants.VERI_CHANGE_PHONE && resultCode == Activity.RESULT_OK) {
Log.v(LogUtils.filename(new Exception()),LogUtils.funAndLine(new Exception())+data.getStringExtra("phone"));
changePhone(data.getStringExtra("phone"));
}
}
/**
* 显示忘记密码对话框
*/
public void showForgetPwDialog() {
final EditText editText = new EditText(mContext);
editText.setHint("请输入注册邮箱");
//弹出输入框
new AlertDialog.Builder(this)
.setTitle("忘记密码")
.setView(editText)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String input = editText.getText().toString();
if (input.equals("")) {
SnackbarUtils.show(mContext, "内容不能为空!");
}else{
//找回密码
BmobUser.resetPasswordByEmail(input, new UpdateListener() {
@Override
public void done(BmobException e) {
if(e==null){
ToastUtils.show(mContext,"重置密码请求成功,请到邮箱进行密码重置操作");
}else{
ToastUtils.show(mContext,"失败:" + e.getMessage());
}
}
});
}
}
})
.setNegativeButton("取消", null)
.show();
}
/**
* 显示修改密码对话框
*/
public void showChangePwdDialog() {
final LinearLayout layout=new LinearLayout(mContext);
//加载布局
View view= LayoutInflater.from(mContext).inflate(R.layout.dialog_change_password,layout,false);
TextInputLayout til=(TextInputLayout)view.findViewById(R.id.change_til_password);
TextInputLayout til1=(TextInputLayout)view.findViewById(R.id.change_til_repassword);
final EditText editText = til.getEditText();
final EditText editText1 = til1.getEditText();
//加入视图
layout.addView(view);
if (pwDialog == null) {
pwDialog = new AlertDialog.Builder(this)
.setTitle("修改密码")
.setView(layout)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String input = editText.getText().toString();
String input1 = editText1.getText().toString();
if (input.equals("")||input1.equals("")) {
Toast.makeText(getApplicationContext(), "不能为空!" + input,
Toast.LENGTH_SHORT).show();
}else if(input.equals(input1)){
//修改密码
changePw(input);
} else {
Toast.makeText(mContext,
"两次输入不一致", Toast.LENGTH_LONG).show();
}
}
})
.setNegativeButton("取消", null)
.create();
}
if (!pwDialog.isShowing()) {
pwDialog.show();
}
}
/**
* 显示清除缓存对话框
*/
public void showCacheDialog() {
if (cacheDialog == null) {
cacheDialog = new AlertDialog.Builder(this)
.setTitle("清除缓存")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
GlideCacheUtil.getInstance().clearImageDiskCache(mContext);
}
})
.setNegativeButton("取消", null)
.create();
}
if (!cacheDialog.isShowing()) {
cacheDialog.show();
}
}
/**
* 更新用户密码
*/
public void changePw(String password) {
if (currentUser == null)
return;
ProgressUtils.show(mContext, "正在修改...");
currentUser.setPassword(password);
currentUser.update(new UpdateListener() {
@Override
public void done(BmobException e) {
ProgressUtils.dismiss();
if (e!=null){
ToastUtils.show(mContext,"修改失败"+e.getMessage());
Log.v(LogUtils.filename(new Exception()), LogUtils.funAndLine(new Exception()) +currentUser.getUsername()+ e.getMessage());
} else{
ToastUtils.show(mContext,"修改成功");
}
}
});
}
/**
* 更新用户手机号
*/
public void changePhone(String phone) {
if (currentUser == null)
return;
ProgressUtils.show(mContext, "正在修改...");
currentUser.setMobilePhoneNumber(phone);
currentUser.update(new UpdateListener() {
@Override
public void done(BmobException e) {
ProgressUtils.dismiss();
if (e!=null){
ToastUtils.show(mContext,"修改失败"+e.getMessage());
Log.v(LogUtils.filename(new Exception()), LogUtils.funAndLine(new Exception()) +currentUser.getUsername()+ e.getMessage());
} else{
ToastUtils.show(mContext,"修改成功");
}
}
});
}
}
还有mainActivity:
package com.example.yangzi.mvp_dev.ui.activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.yangzi.mvp_dev.R;
import com.example.yangzi.mvp_dev.base.BaseActivity;
import com.example.yangzi.mvp_dev.bean.remote.MyUser;
import com.example.yangzi.mvp_dev.utils.LogUtils;
import com.example.yangzi.mvp_dev.utils.ThemeManager;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cn.bmob.v3.BmobUser;
public class MainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener{
@BindView(R.id.toolbar)
android.support.v7.widget.Toolbar toolbar;
@BindView(R.id.drawer_layout)
DrawerLayout drawer;
@BindView(R.id.nav_view)
NavigationView navigationView;
private View drawerHeader;
private ImageView drawerIv;
private TextView drawerTvAccount, drawerTvMail;
protected static final int USERINFOACTIVITY_CODE = 0;
protected static final int LOGINACTIVITY_CODE = 1;
@Override
protected int getLayout() {
return R.layout.activity_main;
}
@Override
protected void initEventAndData() {
//初始化Toolbar
toolbar.setTitle("MVP");
setSupportActionBar(toolbar);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
if (navigationView.getHeaderCount()>0) {
drawerHeader =navigationView.getHeaderView(0);
}else {
drawerHeader = navigationView.inflateHeaderView(R.layout.drawer_header);
}
drawerIv = (ImageView) drawerHeader.findViewById(R.id.drawer_iv);
drawerTvAccount = (TextView) drawerHeader.findViewById(R.id.drawer_tv_name);
drawerTvMail = (TextView) drawerHeader.findViewById(R.id.drawer_tv_mail);
//监听点击登陆事件
drawerHeader.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
if (currentUser==null) {
//用户id为0表示未有用户登陆
startActivityForResult(new Intent(MainActivity.this, LoginActivity.class), LOGINACTIVITY_CODE);
} else {
//进入账户中心
startActivityForResult(new Intent(MainActivity.this, UserInfoActivity.class), USERINFOACTIVITY_CODE);
}
}
});
//设置头部账户
setDrawerHeaderAccount();
//监听侧滑菜单
navigationView.setNavigationItemSelectedListener(this);
}
/**
* 设置DrawerHeader的用户信息
*/
public void setDrawerHeaderAccount() {
currentUser= BmobUser.getCurrentUser(MyUser.class);
//获取当前用户
if (currentUser != null) {
drawerTvAccount.setText(currentUser.getUsername());
drawerTvMail.setText(currentUser.getMobilePhoneNumber());
if (currentUser.getImage()!=null) Glide.with(mContext).load(currentUser.getImage()).into(drawerIv);
}else{
drawerTvAccount.setText("账号");
drawerTvMail.setText("点我登陆");
drawerIv.setImageResource(R.mipmap.ic_def_icon);
}
}
/**
* 监听Drawer
*/
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
/**
* 监听点击事件 R.id.drawer_tv_name,R.id.drawer_tv_mail
*
* @param view
*/
@OnClick({})
public void onClick(View view) {
switch (view.getId()) {
default:
break;
}
}
/**
* 监听Activity返回值f
*
* @param requestCode
* @param resultCode
* @param data
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case USERINFOACTIVITY_CODE:
setDrawerHeaderAccount();
break;
case LOGINACTIVITY_CODE:
setDrawerHeaderAccount();
break;
}
}
}
/**
* 显示修改主题色 Dialog
*/
private void showUpdateThemeDialog() {
final String[] themes = ThemeManager.getInstance().getThemes();
new AlertDialog.Builder(mContext)
.setTitle("选择主题")
.setItems(themes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ThemeManager.getInstance().setTheme(mContext, themes[which]);
}
}).create().show();
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if (id == R.id.nav_exit) { //退出登陆
currentUser= BmobUser.getCurrentUser(MyUser.class);
if (currentUser==null)
{
new AlertDialog.Builder(mContext).setTitle("当前账户未登录").show();
}else {
//退出登陆
new AlertDialog.Builder(mContext).setTitle("是否退出当前账户")
.setNegativeButton("取消", null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
MyUser.logOut();
//清除本地数据
//LocalRepository.getInstance().deleteAllBills();
//刷新账户数据
//setDrawerHeaderAccount();
initEventAndData();
}
})
.show();
}
} else if (id == R.id.nav_theme) { //主题
showUpdateThemeDialog();
}else if (id == R.id.nav_setting) { //设置
startActivity(new Intent(this, SettingActivity.class));
}
return false;
}
}
还有 验证码验证的Activity:
package com.example.yangzi.mvp_dev.ui.activity;
import android.app.Activity;
import android.content.Intent;
import android.support.design.widget.TextInputLayout;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.example.yangzi.mvp_dev.R;
import com.example.yangzi.mvp_dev.base.BaseActivity;
import com.example.yangzi.mvp_dev.bean.remote.MyUser;
import com.example.yangzi.mvp_dev.mvp.presenter.Imp.UserLogPresenterImp;
import com.example.yangzi.mvp_dev.mvp.presenter.UserLogPresenter;
import com.example.yangzi.mvp_dev.mvp.view.UserLogView;
import com.example.yangzi.mvp_dev.utils.LogUtils;
import com.example.yangzi.mvp_dev.utils.ProgressUtils;
import com.example.yangzi.mvp_dev.utils.RegexUtils;
import com.example.yangzi.mvp_dev.utils.SnackbarUtils;
import com.example.yangzi.mvp_dev.utils.ToastUtils;
import com.example.yangzi.mvp_dev.widget.OwlView;
import com.example.yangzi.mvp_dev.widget.VerifyCodeButton;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import butterknife.OnFocusChange;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.BmobSMS;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.QueryListener;
import cn.bmob.v3.listener.UpdateListener;
/**
* Created by zhouas666 on 2017/12/8.
*/
public class VerifyPhoneActivity extends BaseActivity implements UserLogView {
String phonenum;
boolean isphoneExisted= false;
@BindView(R.id.verify_et_phone)
TextInputLayout phone;
@BindView(R.id.verify_text)
TextView phonetext;
@BindView(R.id.verify_get_code)
TextInputLayout getCode;
@BindView(R.id.btn_verify_get_code)
VerifyCodeButton getcodeBtn;
@BindView(R.id.verify_btn_verify)
Button loginBtn;
private EditText mEdtPhone;
private EditText mEdtCode;
@Override
protected int getLayout() {
return R.layout.activity_verify_phone;
}
@Override
protected void initEventAndData() {
phone.setVisibility(View.GONE);
mEdtPhone = phone.getEditText();
Intent intent = getIntent();
phonenum = intent.getStringExtra("phoneNumber");
if (intent.getStringExtra("index").equals("1001")) {
phone.setVisibility(View.VISIBLE); //如果是修改手机号,验证新输入的手机号
} else {
phonetext.setText("(" + phonenum.substring(0, 3) + "****" + phonenum.substring(7, 11) + ")"); //如果是其他,验证传进的手机号
}
mEdtCode = getCode.getEditText();
mEdtCode.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String code = charSequence.toString();
if (!RegexUtils.checkCode(code)) {
getCode.setError("请输入正确的验证码");
} else {
getCode.setErrorEnabled(false);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
/**
* 监听点击事件
*
* @param view
*/
@OnClick({R.id.btn_verify_get_code, R.id.verify_btn_verify})
protected void onClick(View view) {
switch (view.getId()) {
case R.id.btn_verify_get_code: // 获取验证码
getCode();
break;
case R.id.verify_btn_verify: //button
verify(); //登陆
break;
default:
break;
}
}
private void getCode() {
if(phone.isShown()) phonenum = mEdtPhone.getText().toString();
requestSMScodeFromBmob(phonenum);
}
/**
* 请求验证码
* @param phone_number 手机号
* @param template_name 验证码模板名称
* @param listener 回调
*/
/**
* TODO template 如果是自定义短信模板,此处替换为你在控制台设置的自定义短信模板名称;如果没有对应的自定义短信模板,则使用默认短信模板。
*/
public void requestSMScodeFromBmob(String phone) {
getcodeBtn.start();
Log.v(LogUtils.filename(new Exception()),LogUtils.funAndLine(new Exception())+phone);
BmobSMS.requestSMSCode(phone, "register", new QueryListener<Integer>() {
@Override
public void done(Integer smsId, BmobException e) {
if (e == null) {
Toast.makeText(mContext, "发送验证码成功,短信ID:" + smsId + "\n", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext, "发送验证码失败:" + e.getErrorCode() + "-" + e.getMessage() + "\n", Toast.LENGTH_SHORT).show();
}
}
});
}
/**
* 执行验证动作
*/
public void verify() {
if(phone.isShown()) phonenum = mEdtPhone.getText().toString();
String code = mEdtCode.getText().toString();
Log.v(LogUtils.filename(new Exception()),LogUtils.funAndLine(new Exception())+phonenum);
veriflySMSCode(phonenum,code);
}
private void veriflySMSCode(final String phonenumber,final String code) {
BmobSMS.verifySmsCode(phonenumber, code, new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null) {
ToastUtils.show(mContext, "验证码验证成功");
ProgressUtils.dismiss();
Intent intent= new Intent();
intent.putExtra("phone",phonenum);
setResult(Activity.RESULT_OK, intent);//返回上一个activity
finish();
}else{
ToastUtils.show(mContext, "验证失败"+phonenumber+code);
}
}
});
}
@Override
public void loadDataSuccess(MyUser tData) {
}
@Override
public void loadDataError(Throwable throwable) {
}
}
其他的一些我就不一一贴出了。
可以进入下面链接下载完整demo。 https://download.csdn.net/download/linzihahaha/10887958
另外由于bmob的短信发送是需要收费的,所以真正是无法发送短信成功的,如果有需要,可以留言找我要ID,替换后,就能收到短信验证码了。
本文实例大的UI 结构设计参考 http://tieba.baidu.com/p/5661102867,侵删。