栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android如何通过手机获取验证码来完成注册功能

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android如何通过手机获取验证码来完成注册功能

注册很多app或者网络账户的时候,经常需要手机获取验证码,来完成注册,那时年少,只是觉得手机获取验证码这件事儿很好玩,并没有关心太多,她是如何实现的,以及她背后的故事到底是什么样子的,现在小编接手的这个项目里面,就需要通过手机号进行注册,并且手机号发送相应的验证码,来完成注册,那么在一些应用app里面到底是如何实现点击按钮获取验证码,来完成注册这整个流程的呢?今天小编就以注册为例,和小伙伴们分享一下,如何通过手机号获取验证码来完成注册的一整套流程以及如何采用正则表达式来验证手机号码是否符合电信、移动、联通的规范。

       首先我们需要做的第一步就是ApiClient里面编写获取验证码的方法,具体代码如下:


 
  public static String getValidateCode(AppContext appContext, 
      Map map) throws AppException { 
    // 定义要访问的接口和要强转的实体 
    String validateUrl = _MakeURL(URLs.VALIDATE_CODE_URL, map); 
    ValidateCode validateCode = null; 
    try { 
      // 获取服务器端Json数据 
      String json = http_get(appContext, validateUrl); 
 
      // 解析为制定的实体对象 
      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里面的接口方法,具体代码如下所示:

 
  public String getCode(Map map) throws AppException { 
 
    String validateCode = ""; 
 
    // 如果网络可连接且解析无误返回正确的验证码,否则返回空字符串 
    if (isNetworkConnected()) { 
      try { 
 validateCode = ApiClient.getValidateCode(this, map); 
      } catch (AppException e) { 
 if (validateCode == "") { 
   throw e; 
 } 
      } 
    } 
    return validateCode; 
  } 
 

        第三步,在StringUtils里面编写验证号码是否是手机号的正则表达式,具体代码如下:

  
   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里面的文件,具体代码如下所示:

 
 
   
    

        第五步:编写java类RegisterActivity里面的代码,具体如下所示:

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; 
 
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 registerParams = new HashMap(); 
   
  private Map codeParams = new HashMap(); 
   
  private String regisgerStatus; 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.register); 
    initView();    
  } 
   
  public void initView() { 
    // 初始化控件 
    etRegisterName = (EditText) findViewById(R.id.et_register_username_id); 
    etCode = (EditText) findViewById(R.id.et_register_code_id); 
    etPassword = (EditText) findViewById(R.id.et_register_password_id); 
    btCode = (Button) findViewById(R.id.bt_getcode_id); 
    btRegister = (Button) findViewById(R.id.bt_register_id); 
    tvUserProtocol=(TextView)findViewById(R.id.user_protocol); 
    btRegisterLoginBack=(Button)findViewById(R.id.register_back_login); 
    // 初始化监听事件 
    btCode.setonClickListener(this); 
    btRegister.setonClickListener(this); 
    tvUserProtocol.setonClickListener(this); 
    btRegisterLoginBack.setonClickListener(this); 
  } 
  private boolean isvalidate() { 
    // TODO Auto-generated method stub 
    // 获取控件输入的值 
    String userName = etRegisterName.getText().toString().trim(); 
    if (StringUtils.isEmpty(userName)) { 
      Toast.makeText(this, "手机号不能为空", Toast.LENGTH_SHORT).show(); 
      return false; 
    } 
    if (!StringUtils.isPhoneNumberValid(userName)) { 
      Toast.makeText(this, "手机号有误", Toast.LENGTH_SHORT).show(); 
      return false; 
    } 
    return true; 
  } 
 
  @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(); 
  } 
   
  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; 
  } 
   
  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(); 
      } 

    } 
  }
  //--------------------------------获取验证码线程处理过程---开始----------------------------- 
   
  private static class CodeHandler extends Handler { 
    // 持有对本外部类的弱引用 
    private final WeakReference mActivity; 
    public CodeHandler(RegisterActivity activity) { 
      mActivity = new WeakReference(activity); 
    } 
    @Override 
    public void handleMessage(Message msg) { 
      // 获取上下文对象 
      RegisterActivity activity = mActivity.get(); 
      if (activity != null) { 
 switch (msg.what) { 
 case 1: 
   serverValicationCode = (String)msg.obj; 
   //activity.etCode.setText(serverValicationCode); 
   break; 
 case -1: 
   Toast.makeText(activity, "获取验证码失败!", Toast.LENGTH_SHORT).show(); 
   break; 
 case 0: 
   Toast.makeText(activity, "哎呀,出错啦..", Toast.LENGTH_SHORT).show(); 
   break; 
 default: 
   break; 
 } 
      } 
    } 
  } 
   
  private final CodeHandler codeHandler = new CodeHandler(this); 
  private String serverCode=null; 
   
  private Runnable codeRunnable = new Runnable() { 
    @Override 
    public void run() { 
      Message msg = new Message(); 
      Map map = new HashMap(); 
      map.put("jbPhone", userName); 
      // 获取全局对象Application 
      AppContext appContext = (AppContext) getApplication(); 
      try { 
 // 获取服务器数据 
 serverValicationCode = appContext.getCode(map); 
 // 返回true则将消息的what值为1,为false则what为-1,异常为0 
 if (serverValicationCode.equals("")) { 
   msg.what = -1; 
 } else { 
   msg.what = 1; 
   msg.obj = serverValicationCode; 
 } 
      } catch (AppException e) { 
 msg.what = 0; 
 e.printStackTrace(); 
      } 
      codeHandler.sendMessage(msg); 
    } 
  }; 

    //--------------------------------获取验证码线程处理过程----完成------------------------------  

   //--------------------------------注册线程处理过程--开始----------------------------------  

   
  private static class MyHandler extends Handler { 
    // 持有对本外部类的弱引用 
    private final WeakReference mActivity; 
 
    public MyHandler(RegisterActivity activity) { 
      mActivity = new WeakReference(activity); 
    } 
    @Override 
    public void handleMessage(Message msg) { 

      // 获取上下文对象 
      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; 
 } 
      } 
    } 
  } 
   
  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); 
    } 
  }; 

    //--------------------------------注册线程处理过程---完成-----------------------------------  

   
  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不知道为什么不能运行了,所以委屈小伙伴们一下,看不了动态图片了,不过并不影响,我们首先用一个号码好注册一下,如下图所示:

        看一下手机收到的验证码:   

        最后来看一下,我们的注册:       

 

小编寄语:该博文,小编主要简单的介绍了如何通过手机获取验证码来完成注册的功能,以及如何利用正则表达式来验证码手机号码是否符合移动、联通、电信。还是那句话对于小编来说,既是挑战更是机遇,因为知识都是相通的,再者来说,在小编的程序人生中,留下最珍贵的记忆,虽然以后小编不一定从事安卓这个行业,代码世界里,很多种事,有的甜蜜,有的温馨,有的婉转成歌,有的绵延不息,在这些故事里,我们唯一的共通之处就是,某年,某月,某个波澜不惊的日子里,曾经很爱很爱你!爱你--这段实习的日子里,安卓带给小编的种种的惊喜。  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/164037.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号