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中使用listview实现qq/微信好友列表

    Android中使用listview实现qq/微信好友列表

    本文主要介绍了android中使用listview实现qq/微信好友列表(头像,昵称,个性签名)的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • Android json数据解析详解及实例代码

    Android json数据解析详解及实例代码

    这篇文章主要介绍了 Android json数据解析详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • Android 实现把bitmap图片的某一部分的颜色改成其他颜色

    Android 实现把bitmap图片的某一部分的颜色改成其他颜色

    这篇文章主要介绍了Android 实现把bitmap图片的某一部分的颜色改成其他颜色,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Android基础之使用Fragment控制切换多个页面

    Android基础之使用Fragment控制切换多个页面

    Android官方已经提供了Fragment的各种使用的Demo例子,在我们SDK下面的API Demo里面就包含了Fragment的各种使用例子,需要看Demo的朋友,直接看API Demo那个程序就可以了,不用到处去找。里面分开不同功能,实现了不同的类
    2013-07-07
  • Android studio 禁用AndroidX方式

    Android studio 禁用AndroidX方式

    这篇文章主要介绍了Android studio 禁用AndroidX方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Android集成微信支付功能

    Android集成微信支付功能

    这篇文章主要为大家详细介绍了Android集成微信支付功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android使用MediaRecorder类实现视频和音频录制功能

    Android使用MediaRecorder类实现视频和音频录制功能

    Android提供了MediaRecorder这一个类来实现视频和音频的录制功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-07-07
  • Android在Fragment中实现监听触摸事件

    Android在Fragment中实现监听触摸事件

    这篇文章主要给大家介绍了Android在Fragment中实现监听触摸事件的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • Android图片的Base64编码与解码及解码Base64图片方法

    Android图片的Base64编码与解码及解码Base64图片方法

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。接下来通过本文给大家分享Android图片的Base64编码与解码及解码Base64图片,需要的朋友参考下吧
    2017-12-12
  • Android实现微信朋友圈发本地视频功能

    Android实现微信朋友圈发本地视频功能

    这篇文章主要介绍了Android实现微信朋友圈发本地视频功能的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11

最新评论