注册很多app或者网络账户的时候,经常需要手机获取验证码,来完成注册,那时年少,只是觉得手机获取验证码这件事儿很好玩,并没有关心太多,她是如何实现的,以及她背后的故事到底是什么样子的,现在小编接手的这个项目里面,就需要通过手机号进行注册,并且手机号发送相应的验证码,来完成注册,那么在一些应用app里面到底是如何实现点击按钮获取验证码,来完成注册这整个流程的呢?今天小编就以注册为例,和小伙伴们分享一下,如何通过手机号获取验证码来完成注册的一整套流程以及如何采用正则表达式来验证手机号码是否符合电信、移动、联通的规范。
首先我们需要做的第一步就是ApiClient里面编写获取验证码的方法,具体代码如下:
/*** 说明:获取验证码* 作者:丁国华* 时间:2015-8-27 下午5:47:36*/ public static String getValidateCode(AppContext appContext,Map
// 解析为制定的实体对象validateCode = (ValidateCode) JSON.parseObject(json,ValidateCode.class);
} catch (Exception e) {if (e instanceof AppException) throw (AppException) e;throw AppException.network(e);}
// 返回验证码return validateCode.getCode();} 第二步编写AppContent里面的接口方法,具体代码如下所示:
/*** 说明:获取服务器验证码(不需要缓存)
* 作者:丁国华* @date 2015-8-28 上午9:07:14*/ public String getCode(Map
String validateCode = "";
// 如果网络可连接且解析无误返回正确的验证码,否则返回空字符串if (isNetworkConnected()) {try {validateCode = ApiClient.getValidateCode(this, map);} catch (AppException e) {if (validateCode == "") {throw e;}}}return validateCode;} 第三步,在StringUtils里面编写验证号码是否是手机号的正则表达式,具体代码如下:
/* 说明:移动:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188* 联通:130、131、132、152、155、156、185、186* 电信:133、153、180、189* 总结起来就是第一位必定为1,第二位必定为3或5或8,其他位置的可以为0-9* 验证号码 手机号 固话均可* 作者:丁国华* 2015年9月20日 13:52:35*/ public static boolean isPhoneNumberValid(String phoneNumber) {boolean isValid = false;String expression = "((^(13|15|18)[0-9]{9}$)|(^0[1,2]{1}\\d{1}-?\\d{8}$)|(^0[3-9] {1}\\d{2}-?\\d{7,8}$)|(^0[1,2]{1}\\d{1}-?\\d{8}-(\\d{1,4})$)|(^0[3-9]{1}\\d{2}-? \\d{7,8}-(\\d{1,4})$))";CharSequence inputStr = phoneNumber;Pattern pattern = Pattern.compile(expression);Matcher matcher = pattern.matcher(inputStr);if (matcher.matches() ) {isValid = true;}return isValid;} 第四步:编写xml里面的文件,具体代码如下所示:
package com.jczb.car.ui;import java.lang.ref.WeakReference;import java.util.HashMap;import java.util.Map;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import com.jczb.car.AppContext;import com.jczb.car.AppException;import com.jczb.car.R;import com.jczb.car.common.StringUtils;/*** 说明:注册功能页面 我们实现了取消线程的机制,从而保证它不会泄露 onDestroy()常常被用来在Activity推出前取消线程* 作者: 吴利昌* 时间: 2015-9-3上午9:19:15*/ public class RegisterActivity extends Activity implements OnClickListener {// 声明用到的页面控件private EditText etRegisterName;private EditText etCode;private EditText etPassword;private Button btCode;private Button btRegister;private TextView tvUserProtocol;private Button btRegisterLoginBack;// 定义变量private String userName;private String passWord;public boolean isChange = false;private boolean tag = true;private int i = 60;Thread thread = null;/**客户端输入的验证码*/ private String valicationCode;/**服务器端获取的验证码*/ private static String serverValicationCode;/** 注册时所带的参数 */ private Map
@Override public void onClick(View v) {switch (v.getId()) {case R.id.bt_getcode_id:if(!isvalidate()) break;btCode.setText("获取验证码");btCode.setClickable(true);isChange = true;changeBtnGetCode();getValidateCode();break;case R.id.bt_register_id:register();break;case R.id.user_protocol:Intent intentUserProtocol = new Intent(this,UserProtocolActivity.class);startActivity(intentUserProtocol);break;case R.id.register_back_login:this.finish();break;default:break;}}private void changeBtnGetCode() {thread = new Thread() {@Override public void run() {if (tag) {while (i > 0) {i--;if (RegisterActivity.this == null) {break;}RegisterActivity.this.runOnUiThread(new Runnable() {@Override public void run() {btCode.setText("获取验证码("+ i + ")");btCode.setClickable(false);}});try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}tag = false;}i = 60;tag = true;if (RegisterActivity.this != null) {RegisterActivity.this.runOnUiThread(new Runnable() {@Override public void run() {btCode.setText("获取验证码");btCode.setClickable(true);}});}};};thread.start();}/*** 说明:获取验证码** 作者: 吴利昌* 时间: 2015-9-3 下午3:26:55*/ public boolean getValidateCode() {String name = etRegisterName.getText().toString().trim();String code = etCode.getText().toString().trim();if (name.equals("")) {Toast.makeText(this, "请输入用户名或手机号!", Toast.LENGTH_SHORT).show();return false;}else {userName = name;valicationCode = code;Thread codeThread = new Thread(codeRunnable);codeThread.start();}return true;}/*** 说明:注册** 作者: 吴利昌* 时间: 2015-9-3 下午3:27:23*/ public void register() {// 1.首先判断输入的值是否有效// 2.然后判断输入的验证码是否有效(防止没有点击获取验证码自己填的错误验证码)// 3.最后注册if (isValid()) {if (valicationCode.equals(serverValicationCode)) {Thread thread = new Thread(sRunnable);thread.start();}else {Toast.makeText(this, "输入的验证码不正确!", Toast.LENGTH_SHORT).show();}
}}//--------------------------------获取验证码线程处理过程---开始-----------------------------/*** 自定义一个静态的具有弱引用的Handler,解决内存泄漏的问题,本handler用来获取验证码*/ private static class CodeHandler extends Handler {// 持有对本外部类的弱引用private final WeakReference
//--------------------------------注册线程处理过程--开始----------------------------------
/*** 自定义一个静态的具有弱引用的Handler,解决内存泄漏的问题,注册使用*/ private static class MyHandler extends Handler {// 持有对本外部类的弱引用private final WeakReference
public MyHandler(RegisterActivity activity) {mActivity = new WeakReference
// 获取上下文对象RegisterActivity activity = mActivity.get();if (activity != null) {switch (msg.what) {case 1:Toast.makeText(activity, "注册成功!", Toast.LENGTH_SHORT).show();activity.finish();break;case -1:Toast.makeText(activity, "注册失败!", Toast.LENGTH_SHORT).show();break;case -2:Toast.makeText(activity, "该号已经注册!", Toast.LENGTH_SHORT).show();break;case 0:Toast.makeText(activity, "哎呀,出错啦..", Toast.LENGTH_SHORT).show();break;default:break;}}}}/**实例化自定义的handler*/ private final MyHandler mHandler = new MyHandler(this);/**自定义子线程*/ private Runnable sRunnable = new Runnable() {@Override public void run() {Message msg = new Message();// 获取全局对象Application AppContext appContext = (AppContext) getApplication();try {// 获取服务器数据regisgerStatus = appContext.register(registerParams);
// 返回true则将消息的what值为1,为false则what为-1,异常为0 if (regisgerStatus.equals("true")) {msg.what = 1;msg.obj = regisgerStatus;} else if(regisgerStatus.equals("1")){msg.what = -2;}else if(regisgerStatus.equals("false")){msg.what = -1;}} catch (AppException e) {msg.what = 0;e.printStackTrace();}mHandler.sendMessage(msg);}}; //--------------------------------注册线程处理过程---完成-----------------------------------/*** 说明:注册之前判断数据是否为空** @return* 作者: 吴利昌* 时间: 2015-9-3 下午3:29:04*/ public boolean isValid() {userName = etRegisterName.getText().toString().trim();valicationCode = etCode.getText().toString().trim();passWord = etPassword.getText().toString().trim();if (userName.equals("")) {Toast.makeText(this, "用户名不能为空!", Toast.LENGTH_SHORT).show();return false;}if (valicationCode.equals("")) {Toast.makeText(this, "验证码不能为空!", Toast.LENGTH_SHORT).show();return false;}if(!serverValicationCode.equals(valicationCode)){Toast.makeText(this, "验证码错误", Toast.LENGTH_SHORT).show();return false;}if (passWord.equals("")) {Toast.makeText(this, "密码不能为空!", Toast.LENGTH_SHORT).show();return false;} else if (passWord.length() < 6) {Toast.makeText(this, "密码至少6位!", Toast.LENGTH_SHORT).show();return false;}registerParams.put("username", userName);registerParams.put("psd", passWord);return true;}}
最后,我们来运行一下,看看我们的效果,由于小编的genymotion不知道为什么不能运行了,所以委屈小伙伴们一下,看不了动态图片了,不过并不影响,我们首先用一个号码好注册一下,如下图所示:
看一下手机收到的验证码:
最后来看一下,我们的注册:
小编寄语:该博文,小编主要简单的介绍了如何通过手机获取验证码来完成注册的功能,以及如何利用正则表达式来验证码手机号码是否符合移动、联通、电信。还是那句话对于小编来说,既是挑战更是机遇,因为知识都是相通的,再者来说,在小编的程序人生中,留下最珍贵的记忆,虽然以后小编不一定从事安卓这个行业,代码世界里,很多种事,有的甜蜜,有的温馨,有的婉转成歌,有的绵延不息,在这些故事里,我们唯一的共通之处就是,某年,某月,某个波澜不惊的日子里,曾经很爱很爱你!爱你--这段实习的日子里,安卓带给小编的种种的惊喜。
您可能感兴趣的文章:android实现注册登录程序Android实现登录注册页面(下) Android实现登录注册功能Android基于Sqlite实现注册和登录功能Android实现注册登录界面的实例代码Android设计登录界面、找回密码、注册功能Android客户端实现注册、登录详解(1)
Android开发中实现用户注册和登陆的代码实例分享Android用户注册界面简单设计Android用SharedPreferences实现登录注册注销功能
