利用Bmob公司的云服务实现获取短信验证码登录操作

来源:互联网 发布:网络传输异常 编辑:程序博客网 时间:2024/05/17 02:22
/** * 目标要求:输入手机号,点击获取验证码,用户把验证码填写完毕,点击登录 * 细节: * 1、输入手机号时,判断是不是11位手机号,不是11位,当点击获取 * 验证码按钮时则提示-->请输入11位有效手机号码,是11位,则进行点击获取验 * 证码操作,并提示验证码已发送,请尽快使用 * 2、当进行获取验证码操作后,获取验证码按钮变成灰色,且不可点击,并进行 * 倒计时操作,倒计时1分钟后可以重新点击,再次发送验证码 * 3、点击登录按钮时,若手机号和验证码有一个为空,则提示手机号与验证码 * 不能为空,若验证码已填写,则判断用户填写所验证码与系统发送验证码是否一致, * 一致则提示登录成功,错误则提示验证码输入错误*/
准备工作:首先要在bmob公司注册一个帐号,然后进入bmob网站的下载页面,下载Android短信SDK压缩包到本地,解压之后有一个
BmobSMS_V1.0.1_20150710.jar文件,把这个jar包放到IDE的libs目录下,eclipse直接放到libs目录下即可,android studio导入jar包的操作见我之前的文章有详细的步骤,jar包导入成功之后进行BmobSMS的初始化:
BmobSMS.initialize(MainActivity.this, "336be8699869f10b984f71c0c3cdb91a");第一个参数为上下文,第二个参数为你在bmob所建立的网络应用的application Id,那么怎么在bmob网站建立网络应用呢,用文字也说不清楚,大家去慕课网看一个视频就会了,这是视频地址点击打开链接,初始化完毕之后,第二个应该考虑的就是如何获取短信验证码以及相关判断的问题,这个问题直接用代码说明,第三个应该考虑的就是倒计时的问题,这里倒计时利用的是android自己的api:CountDownTimer(),用这个类的时候要实现两个方法,这个类的用法以及两个方法的说明在代码中会有详细注释,这里不再赘述,同时为了界面美观好看,用到了自定义控件,下面上代码:
MainActivity.java代码:
[java] view plain copy
  1. <pre name="code" class="java">package com.example.administrator.demo;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.Color;  
  5. import android.os.Bundle;  
  6. import android.os.CountDownTimer;  
  7. import android.util.Log;  
  8. import android.view.View;  
  9. import android.widget.Button;  
  10. import android.widget.EditText;  
  11. import android.widget.Toast;  
  12.   
  13. import cn.bmob.sms.BmobSMS;  
  14. import cn.bmob.sms.exception.BmobException;  
  15. import cn.bmob.sms.listener.RequestSMSCodeListener;  
  16. import cn.bmob.sms.listener.VerifySMSCodeListener;  
  17.   
  18. public class MainActivity extends Activity implements View.OnClickListener {  
  19.     private EditText userName_et, passWord_et;  
  20.     private Button Message_btn, login_btn;  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.   
  27.         initBomb();  
  28.         initView();  
  29.         initEvent();  
  30.     }  
  31.   
  32.     private void initEvent() {  
  33.         login_btn.setOnClickListener(this);  
  34.         Message_btn.setOnClickListener(this);  
  35.     }  
  36.   
  37.     /** 
  38.      * 目标要求:输入手机号,点击获取验证码,用户把验证码填写完毕,点击登录 
  39.      * 细节: 
  40.      * 1、输入手机号时,判断是不是11位手机号,不是11位,当点击获取 
  41.      * 验证码按钮时则提示-->请输入11位有效手机号码,是11位,则进行点击获取验 
  42.      * 证码操作,并提示验证码已发送,请尽快使用 
  43.      * 2、当进行获取验证码操作后,获取验证码按钮变成灰色,且不可点击,并进行 
  44.      * 倒计时操作,倒计时1分钟后可以重新点击,再次发送验证码 
  45.      * 3、点击登录按钮时,若手机号和验证码有一个为空,则提示手机号与验证码 
  46.      * 不能为空,若验证码已填写,则判断用户填写所验证码与系统发送验证码是否一致, 
  47.      * 一致则提示登录成功,错误则提示验证码输入错误 
  48.      */  
  49.     private void initBomb() {  
  50.         BmobSMS.initialize(MainActivity.this"336be8699869f10b984f71c0c3cdb91a");  
  51.     }  
  52.   
  53.   
  54.     @Override  
  55.     public void onClick(View v) {  
  56.         Log.e("MESSAGE:""1");  
  57.         String userName = userName_et.getText().toString();  
  58.         String passWord = passWord_et.getText().toString();  
  59.         switch (v.getId()) {  
  60.             case R.id.Message_btn:  
  61.                 Log.e("MESSAGE:""2");  
  62.                 if (userName.length() != 11) {  
  63.                     Toast.makeText(this"请输入11位有效手机号码", Toast.LENGTH_SHORT).show();  
  64.                 }  
  65.                 else {  
  66.                     Log.e("MESSAGE:""3");  
  67.                     //进行获取验证码操作和倒计时1分钟操作  
  68.                     BmobSMS.requestSMSCode(this, userName, "短信模板"new RequestSMSCodeListener() {  
  69.                         @Override  
  70.                         public void done(Integer integer, BmobException e) {  
  71.                             if (e == null) {  
  72.                                 //发送成功时,让获取验证码按钮不可点击,且为灰色  
  73.                                 Message_btn.setClickable(false);  
  74.                                 Message_btn.setBackgroundColor(Color.GRAY);  
  75.                                 Toast.makeText(MainActivity.this"验证码发送成功,请尽快使用", Toast.LENGTH_SHORT).show();  
  76.                                 /** 
  77.                                  * 倒计时1分钟操作 
  78.                                  * 说明: 
  79.                                  * new CountDownTimer(60000, 1000),第一个参数为倒计时总时间,第二个参数为倒计时的间隔时间 
  80.                                  * 单位都为ms,其中必须要实现onTick()和onFinish()两个方法,onTick()方法为当倒计时在进行中时, 
  81.                                  * 所做的操作,它的参数millisUntilFinished为距离倒计时结束时的时间,以此题为例,总倒计时长 
  82.                                  * 为60000ms,倒计时的间隔时间为1000ms,然后59000ms、58000ms、57000ms...该方法的参数 
  83.                                  * millisUntilFinished就等于这些每秒变化的数,然后除以1000,把单位变成秒,显示在textView 
  84.                                  * 或Button上,则实现倒计时的效果,onFinish()方法为倒计时结束时要做的操作,此题可以很好的 
  85.                                  * 说明该方法的用法,最后要注意的是当new CountDownTimer(60000, 1000)之后,一定要调用start() 
  86.                                  * 方法把该倒计时操作启动起来,不调用start()方法的话,是不会进行倒计时操作的 
  87.                                  */  
  88.                                 new CountDownTimer(600001000) {  
  89.                                     @Override  
  90.                                     public void onTick(long millisUntilFinished) {  
  91.                                         Message_btn.setBackgroundResource(R.drawable.button_shape02);  
  92.                                         Message_btn.setText(millisUntilFinished / 1000 + "秒");  
  93.                                     }  
  94.   
  95.                                     @Override  
  96.                                     public void onFinish() {  
  97.                                         Message_btn.setClickable(true);  
  98.                                         Message_btn.setBackgroundResource(R.drawable.button_shape);  
  99.                                         Message_btn.setText("重新发送");  
  100.                                     }  
  101.                                 }.start();  
  102.                                 Log.e("MESSAGE:""4");  
  103.                             }  
  104.                             else {  
  105.                                 Toast.makeText(MainActivity.this"验证码发送失败,请检查网络连接", Toast.LENGTH_SHORT).show();  
  106.                             }  
  107.                         }  
  108.                     });  
  109.   
  110.                 }  
  111.                 break;  
  112.             case R.id.login_btn:  
  113.                 Log.e("MESSAGE:""5");  
  114.                 if (userName.length() == 0 || passWord.length() == 0 || userName.length() != 11) {  
  115.                     Log.e("MESSAGE:""6");  
  116.                     Toast.makeText(this"手机号或验证码输入不合法", Toast.LENGTH_SHORT).show();  
  117.                 }  
  118.                 else {  
  119.                     BmobSMS.verifySmsCode(this, userName, passWord, new VerifySMSCodeListener() {  
  120.                         @Override  
  121.                         public void done(BmobException e) {  
  122.                             if (e == null) {  
  123.                                 Log.e("MESSAGE:""7");  
  124.                                 Toast.makeText(MainActivity.this"登录成功", Toast.LENGTH_SHORT).show();  
  125.                             }  
  126.                             else {  
  127.                                 Log.e("MESSAGE:""8");  
  128.                                 Toast.makeText(MainActivity.this"验证码错误", Toast.LENGTH_SHORT).show();  
  129.                             }  
  130.                         }  
  131.                     });  
  132.                 }  
  133.                 break;  
  134.         }  
  135.     }  
  136.   
  137.     private void initView() {  
  138.         userName_et = (EditText) findViewById(R.id.userName_et);  
  139.         passWord_et = (EditText) findViewById(R.id.passWord_et);  
  140.         Message_btn = (Button) findViewById(R.id.Message_btn);  
  141.         login_btn = (Button) findViewById(R.id.login_btn);  
  142.     }  
  143.   
  144.   
  145. }  
对应的布局文件:
[html] view plain copy
  1. <LinearLayout  
  2.     xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical"  
  6.     >  
  7.   
  8.     <EditText  
  9.         android:id="@+id/userName_et"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:hint="手机号码"  
  13.         android:layout_marginTop="100dp"  
  14.         android:layout_marginRight="20dp"  
  15.         android:layout_marginLeft="20dp"  
  16.         android:inputType="number"  
  17.         android:maxLength="11"/>  
  18.   
  19.     <LinearLayout  
  20.         android:layout_width="match_parent"  
  21.         android:layout_height="wrap_content">  
  22.   
  23.         <EditText  
  24.             android:id="@+id/passWord_et"  
  25.             android:layout_width="0dp"  
  26.             android:layout_height="wrap_content"  
  27.             android:hint="验证码"  
  28.             android:layout_marginLeft="20dp"  
  29.             android:inputType="number"  
  30.             android:layout_weight="1"  
  31.             />  
  32.   
  33.         <Button  
  34.             android:id="@+id/Message_btn"  
  35.             android:layout_width="wrap_content"  
  36.             android:layout_height="20dp"  
  37.             android:layout_alignParentRight="true"  
  38.             android:text="获取验证码"  
  39.             android:textSize="8sp"  
  40.             android:layout_marginRight="20dp"  
  41.             android:textColor="@android:color/white"  
  42.             android:background="@drawable/button_shape"  
  43.             android:layout_gravity="center"  
  44.             android:clickable="true"  
  45.             />  
  46.     </LinearLayout>  
  47.   
  48.     <Button  
  49.         android:id="@+id/login_btn"  
  50.         android:layout_width="match_parent"  
  51.         android:layout_height="wrap_content"  
  52.         android:text="登录"  
  53.         android:layout_marginRight="50dp"  
  54.         android:layout_marginLeft="50dp"  
  55.         android:background="@drawable/button_style"  
  56.         android:textColor="@android:color/white"  
  57.         android:layout_marginTop="30dp"/>  
  58. </LinearLayout>  
下面是自定义控件的代码:
button_style.xml
[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <item android:drawable="@drawable/button_shape"  
  4.           android:state_pressed="false"  
  5.         />  
  6.   
  7.     <item android:drawable="@drawable/button_shape01"  
  8.           android:state_pressed="true"/>  
  9.   
  10.   
  11. </selector>  
button_shape.xml
[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:shape="rectangle">  
  5.   
  6.     <!-- 填充的颜色 -->  
  7.          <solid android:color="#6495ED"/>  
  8.     <!-- 设置按钮的四个角为弧形 -->  
  9.     <!-- android:radius 弧形的半径 -->  
  10.     <corners android:radius="5dp"/>  
  11.     <!--<stroke  
  12.         android:width="0.5dp"  
  13.         android:color="@android:color/white"  
  14.         />-->  
  15.     <!--android:color=""给边界线赋颜色,android:width="0.5dp"给边界线赋宽度-->  
  16.   
  17.     <!-- padding:Button里面的文字与Button边界的间隔 -->  
  18.    <!-- <padding  
  19.         android:bottom="10dp"  
  20.         android:left="10dp"  
  21.         android:right="10dp"  
  22.         android:top="10dp"  
  23.         />-->  
  24. </shape>  
button_shape01.xml:
[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:shape="rectangle">  
  5.   
  6.     <!-- 填充的颜色 -->  
  7.          <solid android:color="@android:color/holo_red_light"/>  
  8.     <!-- 设置按钮的四个角为弧形 -->  
  9.     <!-- android:radius 弧形的半径 -->  
  10.     <corners android:radius="5dp"/>  
  11.     <!--<stroke  
  12.         android:width="0.5dp"  
  13.         android:color="@android:color/white"  
  14.         />-->  
  15.     <!--android:color=""给边界线赋颜色,android:width="0.5dp"给边界线赋宽度-->  
  16.   
  17.     <!-- padding:Button里面的文字与Button边界的间隔 -->  
  18.     <padding  
  19.         android:bottom="10dp"  
  20.         android:left="10dp"  
  21.         android:right="10dp"  
  22.         android:top="10dp"  
  23.         />  
  24. </shape>  
button_shape02.xml
[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:shape="rectangle">  
  5.   
  6.     <!-- 填充的颜色 -->  
  7.          <solid android:color="@android:color/darker_gray"/>  
  8.     <!-- 设置按钮的四个角为弧形 -->  
  9.     <!-- android:radius 弧形的半径 -->  
  10.     <corners android:radius="5dp"/>  
  11.     <!--<stroke  
  12.         android:width="0.5dp"  
  13.         android:color="@android:color/white"  
  14.         />-->  
  15.     <!--android:color=""给边界线赋颜色,android:width="0.5dp"给边界线赋宽度-->  
  16.   
  17.     <!-- padding:Button里面的文字与Button边界的间隔 -->  
  18.    <!-- <padding  
  19.         android:bottom="10dp"  
  20.         android:left="10dp"  
  21.         android:right="10dp"  
  22.         android:top="10dp"  
  23.         />-->  
  24. </shape>  
代码部分完毕,下面看看运行效果:
初始界面:                                                 
获取验证码界面:
倒计时完毕界面:输入验证码登录界面:
转载自:http://blog.csdn.net/qiang_xi/article/details/47686311  在此感谢原作者
0 0
原创粉丝点击