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

 更新时间:2015年11月01日 12:09:32   投稿:mrr  
注册app或者网络帐号的时候,经常需要手机获取验证码,来完成注册功能,那么android如何通过手机获取验证码来完成注册功能,代码是怎么实现的呢?下面看看小编给大家带了的一段代码分析吧

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

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


<span style="font-size:18px;">/** 
   * 说明:获取验证码 
   * 作者:丁国华 
   * 时间:2015-8-27 下午5:47:36 
   */ 
  public static String getValidateCode(AppContext appContext, 
      Map<String, Object> 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(); 
  } 
</span> 

       第二步编写AppContent里面的接口方法,具体代码如下所示:

<span style="font-size:18px;">/** 
   * 说明:获取服务器验证码(不需要缓存) 
   * 作者:丁国华 
   * @date 2015-8-28 上午9:07:14 
   */ 
  public String getCode(Map<String, Object> map) throws AppException { 
 
    String validateCode = ""; 
 
    // 如果网络可连接且解析无误返回正确的验证码,否则返回空字符串 
    if (isNetworkConnected()) { 
      try { 
        validateCode = ApiClient.getValidateCode(this, map); 
      } catch (AppException e) { 
        if (validateCode == "") { 
          throw e; 
        } 
      } 
    } 
    return validateCode; 
  } 
</span> 

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

<span style="font-size:18px;"> /* 说明:移动: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; 
   } 
  </span> 

      第四步:编写xml里面的文件,具体代码如下所示:

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:orientation="vertical" > 
  <LinearLayout style="@style/top_title_style" > 
    <Button 
      android:id="@+id/register_back_login" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="5dp" 
      android:background="@null" 
      android:drawableLeft="@drawable/back" 
      android:paddingLeft="5dp" 
      android:text=" 登录" 
      android:textColor="#FFFFFF" 
      android:textSize="18sp" /> 
    <!-- 注册的布局 --> 
    <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="5dp" 
      android:layout_marginTop="2dp" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:paddingLeft="4dp" 
      android:text="注册" 
      android:textColor="#FFFFFF" 
      android:textSize="20sp" /> 
    <!-- 注册的布局 --> 
    <TextView 
      android:id="@+id/nickname_confirm" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_marginTop="2dp" 
      android:gravity="center" 
      android:paddingLeft="60dp" 
      android:paddingRight="10dp" 
      android:textColor="#FFFFFF" 
      android:textSize="20sp" /> 
  </LinearLayout> 
  <RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="45dp" 
    android:minHeight="50.0dip" 
    android:paddingLeft="14.0dip" 
    android:paddingRight="12.0dip" > 
    <ImageView 
      android:layout_width="23.0dip" 
      android:layout_height="23.0dip" 
      android:layout_centerVertical="true" 
      android:src="@drawable/user_picture" /> 
    <EditText 
     android:id="@+id/et_register_username_id" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="20dp" 
      android:background="@null" 
      android:hint="用户名/手机号" 
      android:paddingLeft="15dip" 
      android:paddingTop="8dp" 
      android:textColorHint="#BEBEBE" 
      android:textSize="20sp" /> 
  </RelativeLayout> 
  <View style="@style/PersonalLine" /> 
   <RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="45dp" 
    android:minHeight="50.0dip" 
    android:paddingLeft="14.0dip" 
    android:paddingRight="12.0dip" > 
     <ImageView 
      android:layout_width="23.0dip" 
      android:layout_height="23.0dip" 
      android:layout_centerVertical="true" 
      android:src="@drawable/phone_picture" /> 
    <EditText 
      android:id="@+id/et_register_code_id" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="20dp" 
      android:background="@null" 
      android:hint="请输入验证码" 
      android:paddingLeft="15dip" 
      android:paddingTop="8dp" 
      android:textColorHint="#BEBEBE" 
      android:textSize="20sp" /> 
    <Button 
      android:id="@+id/bt_getcode_id" 
      android:layout_width="120dp" 
      android:layout_height="35dp" 
      android:layout_marginLeft="200dp" 
      android:layout_marginTop="5dp" 
      android:background="@drawable/shape1" 
      android:text="获取验证码" 
      android:textColor="#FFFFFF" 
      android:textSize="10sp" /> 
  </RelativeLayout> 
  <View style="@style/PersonalLine" /> 
  <RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="45dp" 
    android:minHeight="50.0dip" 
    android:paddingLeft="14.0dip" 
    android:paddingRight="12.0dip" > 
    <ImageView 
      android:layout_width="23.0dip" 
      android:layout_height="23.0dip" 
      android:layout_centerVertical="true" 
      android:src="@drawable/lock" /> 
    <EditText 
     android:id="@+id/et_register_password_id" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="20dp" 
      android:background="@null" 
      android:hint="请输入新密码" 
      android:paddingLeft="15dip" 
      android:paddingTop="8dp" 
      android:textColorHint="#BEBEBE" 
      android:textSize="20sp" /> 
  </RelativeLayout> 
  <View style="@style/PersonalLine" /> 
  <LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 
    <!-- 小对勾的布局 --> 
    <CheckBox 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="10dp" 
      android:layout_marginLeft="-10dp" 
      android:scaleX="0.8" 
      android:scaleY="0.8" /> 
    <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
      android:text="我同意" 
      android:textSize="18sp" /> 
    <TextView 
      android:id="@+id/user_protocol" 
      android:layout_width="200dp" 
      android:layout_height="match_parent" 
      android:layout_gravity="center_vertical" 
      android:layout_marginLeft="5dp" 
      android:gravity="center" 
      android:text="用户协议及隐私条款" 
      android:textColor="#FE8B4A" 
      android:textSize="18sp" /> 
  </LinearLayout> 
  <Button 
    android:id="@+id/bt_register_id" 
    android:layout_width="245dp" 
    android:layout_height="45dp" 
    android:layout_gravity="center_horizontal" 
    android:layout_marginBottom="14dp" 
    android:layout_marginLeft="15dp" 
    android:layout_marginRight="15dp" 
    android:layout_marginTop="5dp" 
    android:background="@drawable/shape2" 
    android:gravity="center" 
    android:text="注 册" 
    android:textColor="#FFFFFF" 
    android:textSize="15sp" /> 
  <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="80dp" 
    android:paddingTop="5dp" 
    android:text="您也可以直接登录" 
    android:textColor="#BEBEBE" 
    android:textSize="20sp" /> 
  <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dp" 
    android:baselineAligned="false" 
    android:gravity="center" 
    android:orientation="horizontal" > 
    <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:orientation="vertical" > 
      <Button 
        android:layout_width="60dp" 
        android:layout_height="60dp" 
  android:background="@drawable/weixin_login" /> 
 
      <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="微信登录" 
        android:textColor="#BEBEBE" 
        android:textSize="20sp" /> 
    </LinearLayout> 
    <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:orientation="vertical" > 
      <Button 
        android:layout_width="60dp" 
        android:layout_height="60dp" 
   android:background="@drawable/weibo_login" /> 
      <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="微博登录" 
        android:textColor="#BEBEBE" 
        android:textSize="20sp" /> 
    </LinearLayout> 
    <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:orientation="vertical" > 
      <Button 
      android:layout_width="60dp"       android:layout_height="60dp"         android:background="@drawable/qq_login" /> 
 
      <TextView 
        android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
        android:text="QQ登录" 
        android:textColor="#BEBEBE" 
        android:textSize="20sp" /> 
    </LinearLayout> 
  </LinearLayout> 
</LinearLayout></span> 

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

<span style="font-size:18px;">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<String, Object> registerParams = new HashMap<String, Object>(); 
  /** 获取验证码时所带的参数 */ 
  private Map<String, Object> codeParams = new HashMap<String, Object>(); 
  /** 注册是否成功 */ 
  private String regisgerStatus; 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.register); 
    initView();    
  } 
  /** 
   * 说明:初始化页面控件和事件 
   * 作者: 吴利昌 
   * 时间: 2015-9-3 上午9:23:42 
   */ 
  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(); 
  } 
  /** 
   * 说明:获取验证码 
   * 
   * 作者: 吴利昌 
   * 时间: 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<RegisterActivity> mActivity; 
    public CodeHandler(RegisterActivity activity) { 
      mActivity = new WeakReference<RegisterActivity>(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; 
        } 
      } 
    } 
  } 
  /**实例化自定义的handler*/ 
  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<String, Object> map = new HashMap<String, Object>(); 
      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); 
    } 
  }; 

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

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

  /** 
   * 自定义一个静态的具有弱引用的Handler,解决内存泄漏的问题,注册使用 
   */ 
  private static class MyHandler extends Handler { 
    // 持有对本外部类的弱引用 
    private final WeakReference<RegisterActivity> mActivity; 
 
    public MyHandler(RegisterActivity activity) { 
      mActivity = new WeakReference<RegisterActivity>(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; 
        } 
      } 
    } 
  } 
  /**实例化自定义的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; 
  } 
} 
</span> 


       最后,我们来运行一下,看看我们的效果,由于小编的genymotion不知道为什么不能运行了,所以委屈小伙伴们一下,看不了动态图片了,不过并不影响,我们首先用一个号码好注册一下,如下图所示:

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

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

 

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

相关文章

  • Android View转换为Bitmap实现应用内截屏功能

    Android View转换为Bitmap实现应用内截屏功能

    这篇文章主要介绍了Android View转换为Bitmap实现应用内截屏功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • 详解Android中的Service

    详解Android中的Service

    这篇文章主要介绍了Android中的Service,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • Android6.0蓝牙出现无法扫描设备或闪退问题解决办法

    Android6.0蓝牙出现无法扫描设备或闪退问题解决办法

    这篇文章主要介绍了Android6.0蓝牙出现无法扫描设备或闪退问题解决办法的相关资料,需要的朋友可以参考下
    2017-02-02
  • Android SDK Manager无法更新问题解决办法

    Android SDK Manager无法更新问题解决办法

    这篇文章主要介绍了Android SDK Manager无法更新问题解决办法的相关资料,需要的朋友可以参考下
    2017-04-04
  • android下拉刷新ListView的介绍和实现代码

    android下拉刷新ListView的介绍和实现代码

    在当下,列表组件不带下拉刷新的都不好意思叫列表。第一次完成列表的下拉刷新功能的时候,直接在Activity中实现,虽然功能上是实现了,总体上感觉很乱。所以第二次用到的时候,就想着封装成一个组件,实现和Activity的解耦。
    2013-04-04
  • Android开发欢迎页点击跳过倒计时进入主页

    Android开发欢迎页点击跳过倒计时进入主页

    没点击跳过自然进入主页,点击跳过之后立即进入主页,这个功能怎么实现呢,本文通过实例代码给大家介绍Android开发欢迎页点击跳过倒计时进入主页,感兴趣的朋友一起看看吧
    2023-12-12
  • android studio3.3.1代码提示忽略大小写的设置

    android studio3.3.1代码提示忽略大小写的设置

    这篇文章主要介绍了android studio3.3.1代码提示忽略大小写的设置,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 从源码分析Android的Volley库的工作流程

    从源码分析Android的Volley库的工作流程

    这篇文章主要介绍了从源码分析Android的Volley应用开发框架的工作流程,文中对Volley的请求处理和缓存部分介绍得比较详细,需要的朋友可以参考下
    2016-02-02
  • android自定义左侧滑出菜单效果

    android自定义左侧滑出菜单效果

    这篇文章主要为大家详细介绍了android自定义左侧滑出菜单效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Android下Button实现图文混排效果

    Android下Button实现图文混排效果

    这篇文章主要为大家详细介绍了Android下Button实现图文混排效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08

最新评论