Android开发之短信验证码示例

在说Android中的短信验证码这个知识点前,我们首先来了解下聚合数据。

聚合数据介绍

聚合数据是一家国内最大的基础数据API提供商,专业从事互联网数据服务。免费提供从天气查询、空气质量、地图坐标到金融基金、电商比价、违章查询等各个领域的安全、稳定和高效的数据。开发者可以免费试用聚合数据API进行移动APP的快速开发,免除数据收集、维护等环节,大大降低开发周期及成本。因此我们可以采用聚合数据给我提供好的一套东西来进行短信验证码的功能的添加。

首先我们要做准备工作,使用聚合数据主要分为以下步骤:

第一步,注册聚合数据

进入聚合数据官网(https://www.juhe.cn/)注册一个账号,完成注册后进入,"个人中心"——>“我的数据”点击申请数据如下图所示: 

第二步,申请Appkey

申请后你会得到一个Appkey,此Appkey非常重要。

第三步,下载SDK

下载地址:https://www.juhe.cn/juhesdk

第四步,创建工程,配置环境

1.创建一个工程把我们下载的SDK里libs下的“armeabi文件”和"smscaptcha_v_1_4.jar"复制到我们工程的libs目录下

2.在AndroidManifest中添加开发密钥、所需权限等信息

(1)在application中添加开发密钥


  1. <meta-data     
  2.       android:name="JUHE_KEY"     
  3.       android:value="开发者 key" />  

(2)添加所需权限


  1. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />     
  2. <uses-permission android:name="android.permission.INTERNET" />     
  3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />     
  4. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION " />     
  5. <uses-permission android:name="android.permission.READ_FINE_LOCATION" />   
  6. <uses-permission android:name="android.permission.READ_PHONE_STATE" />   
  7. <uses-permission android:name="android.permission.READ_CONTACTS" />    

(3)在应用程序创建时初始化 SDK引用的Context全局变量

在这一步我们有两种方法

第一种在Activity中配置


  1. public class MainActivity extends Activity {     
  2.     @Override     
  3.     protected void onCreate(Bundle savedInstanceState) {     
  4.         super.onCreate(savedInstanceState);      
  5.         //在使用SDK各组件之前初始化context信息,传入ApplicationContext     
  6.         //注意该方法要再setContentView方法之前实现     
  7.     /**   
  8.     * 初始化方法  
  9.     * @param context  
  10.     * @needFriends 是否需要好友功能  
  11.     */    
  12.         CommonFun.initialize(getApplicationContext(),true);     
  13.         setContentView(R.layout.activity_main);     
  14.     }     
  15. }    

下面这个注意是聚合数据文档给我们的建议,它建议我们把这个初始化工作放在Application中,因为程序运行首先会运行Application中的方法

注意:在SDK各功能组件使用之前都需要调用CommonFun.initialize(getApplicationContext(),true);,因此我们建议该方法放在Application的初始化方法中

所以我们就按它建议的方法,而不采用第一种方法这样我们需要创建一个Applicaiton类MyApplication如下


  1. package com.example.android.sms;   
  2.    
  3. import com.thinkland.sdk.util.CommonFun;   
  4.    
  5. import android.app.Application;   
  6.    
  7. public class MyApplication extends Application {   
  8.    
  9.     @Override   
  10.     public void onCreate() {   
  11.         super.onCreate();   
  12.         CommonFun.initialize(getApplicationContext(), false);    
  13.     }   
  14. }    

声明好Application后不要忘了在清单文件中配置

好了环境已经配置好了,我们来验证一下看看我们是否能收到短信MainActivity的代码如下


  1. package com.example.android.sms;   
  2.    
  3. import com.thinkland.sdk.sms.SMSCaptcha;   
  4. import com.thinkland.sdk.util.BaseData;   
  5. import com.thinkland.sdk.util.CommonFun;   
  6.    
  7. import android.os.Bundle;   
  8. import android.app.Activity;   
  9. import android.util.Log;   
  10. import android.view.Menu;   
  11. import android.widget.Toast;   
  12.    
  13. public class MainActivity extends Activity {   
  14.    
  15.     protected static final String TAG ="MainActivity";   
  16.    
  17.     @Override   
  18.     protected void onCreate(Bundle savedInstanceState) {   
  19.         super.onCreate(savedInstanceState);   
  20.        
  21.         setContentView(R.layout.activity_main);   
  22.         //初始化 SMSCaptcha对象在这个对象中有给我们发送短信验证码的方法   
  23.         SMSCaptcha smsCaptcha=SMSCaptcha.getInstance();   
  24.         //调用发送短信验证码的方法,在其中有一个回调   
  25.            
  26.         /**  
  27.           phone 手机号码  
  28.           callBack  返回结果回调方法.  
  29.          */   
  30.         smsCaptcha.sendCaptcha("此处输入你的手机号",new BaseData.ResultCallBack() {   
  31.                
  32.             @Override   
  33.             public void onResult(int code, String reason, String result) {   
  34.                    
  35.                    /*  
  36.                     code:返回码:  
  37.                     服务器: 0 成功; 1 错误;  
  38.                     本地: -2 本地网络异常; -3 服务器网络异常;-4 解析错误;-5初始化异常  
  39.                     reason:返回信息 成功或错误原因.  
  40.                     result:返回结果,JSON格式.错误或者无返回值时为空.*/   
  41.                    
  42.                 if(code==0){   
  43.                     Log.i(TAG,"code="+code);   
  44.                     Log.i(TAG,"reason="+reason);   
  45.                     Log.i(TAG,"result="+result);   
  46.                 }   
  47.             }   
  48.         });   
  49.     }   
  50. }    

返回结果如下:

第五步:完整的功能的实现,以及界面UI的实现

首先我们来看下界面第一个界面

我们在这个界面输入手机号,及短信的目的地,点击下一步后会弹出一个Dialog

点击确定后会调用会调用聚合数据给我们提供的sendCaptcha方法


  1. /*点击确定后调用sendCaptcha方法向服务器提交手机号码  
  2.                   code(返回码):   
  3.                   服务器:0 成功,1 错误;   
  4.                   本  地:-2 本地网络异常,-3 服务器网络异常,-4 解析错误,-5 初始化异常。   
  5.                   reason(返回信息):成功或错误的原因。   
  6.                   result(返回结果):JSON格式,错误或者无返回值时为空。   
  7.                 */    
  8. smsCaptcha.sendCaptcha(phone,new ResultCallBack() {   
  9.                        
  10. @Override   
  11. public void onResult(int code, String reason, String result) {   
  12. closeDialog();   
  13. if(code==0){   
  14. afterCapterRequested();   
  15. }                          
  16.   }   
  17.    
  18. );    

当返回的code==0时说明短信验证码发送成功,我们需要进行界面的跳转,代码如下


  1. //当code=0成功时,跳转到输入验证码的Activity   
  2.     private void afterCapterRequested() {   
  3.         String phone=etPhoneNumber.getText().toString().trim().replaceAll("\\ss*",    
  4.                 "");   
  5.         String code=tvCountryNumber.getText().toString().trim();   
  6.         String fomatedPhone=code+" "+splitPhoneNum(phone);   
  7.            
  8.         Toast.makeText(this,"成功",Toast.LENGTH_SHORT).show();   
  9.         Intent intent=new Intent();   
  10.         intent.setClass(RegistActivity.this,CaptchaActivity.class);   
  11.         //把手机号码和格式化的手机号码传过去   
  12.         intent.putExtra("formatedPhone",fomatedPhone);   
  13.         intent.putExtra("phone",phone);   
  14.         startActivity(intent);   
  15.     }   
  16.        
  17.     //格式化手机号码的方法,格式化后的形式:+86 131 4118 2951   
  18.     private String splitPhoneNum(String phone) {   
  19.            
  20.         StringBuilder builder=new StringBuilder(phone);   
  21.         builder.reverse();   
  22.         for(int i=4,len=builder.length();i<len;i+=5){   
  23.             builder.insert(i,' ');   
  24.         }   
  25.         builder.reverse();   
  26.         return builder.toString();   
  27.     }    

跳转的界面的布局如下

在这个界面我们需要输入短信验证码,输入短信验证码后点击下一步时会调用聚合数据的commitCaptcha这个方法,比对数据的方法,


  1. smsCaptcha.commitCaptcha(phoneNumbber,verfiyCode,new ResultCallBack() {   
  2.        /*   
  3.                    code:返回码:   
  4.                    服务器: 0 成功; 1 错误;   
  5.                    本地: -2 本地网络异常; -3 服务器网络异常;-4 解析错误;-5初始化异常   
  6.                    reason:返回信息 成功或错误原因.   
  7.                    result:返回结果,JSON格式.错误或者无返回值时为空.*/    
  8.        @Override   
  9.        public void onResult(int code,String reason,String result) {   
  10.        if(code==0){   
  11.        Log.i(TAG,code+"");   
  12.        Log.i(TAG,reason);   
  13.        Log.i(TAG,result);   
  14.        Toast.makeText(CaptchaActivity.this,"您输入的验证码正确",Toast.LENGTH_SHORT).show();   
  15.        CaptchaActivity.this.finish();   
  16.        }else{   
  17.        Toast.makeText(CaptchaActivity.this,"您输入的验证码不正确",Toast.LENGTH_SHORT).show();   
  18.                }   
  19.            }   
  20.        });   

我们可以看到这个方法所需的参数是①手机号码②手机验证码,我们调用此方法后聚合数据的服务器会进行判断,此验证码是否是刚才发送给这个手机号的验证码,验证后给我返回结果,我们根据返回的结果就可以进行相应的操作。在上面的界面中我们发现有一个倒计时的功能,我在这里说一下思路,当然这个倒计时方法有很多。在这个Demo中倒计时是放在一个tvCountDown的一个textView中,首先


  1. //R.string.receiveMessgeCountDown的内容为:<Data>接收短信大约需要<font color=#209526>%s</font>秒</Data>   
  2. //这句话就是用time把 html里的%号替换掉   
  3. String unReceive=getResources().getString(R.string. receiveMessgeCountDown,time );   
  4. //把用html格式化的字符串设置给倒计时的文本框   
  5. tvCountDown.setText(Html.fromHtml(unReceive));  

这样我们可以把html格式化的文本填充到tvCountDown中。接下来就是倒计时的方法了


  1. private final int RETRY_INTERVAL =60;   
  2. private int time=RETRY_INTERVAL;   
  3.     //倒计时方法   
  4.     private void countDown() {   
  5.            new Thread( new Runnable() {   
  6.                   
  7.                 @Override   
  8.                 public void run() {   
  9.                 while( time-->0){   
  10.               //减一后的time把<Data>接收短信大约需要<font color=#209526>%s</font>秒</Data>中的%号替换掉   
  11.                String countDownTime=CaptchaActivity.this .getResources().getString(R.string. receiveMessgeCountDown,time );   
  12.              //在主线程上更新tvCountDown   
  13.              upDateTvCountDown(countDownTime);   
  14.              try {   
  15.                 Thread. sleep(1000);   
  16.                  } catch (InterruptedException e) {   
  17.                      e.printStackTrace();   
  18.                     }   
  19.                 }      
  20.                String countDownTime=CaptchaActivity.this .getResources().getString(R.string. unreceiveMessage, time);   
  21.               upDateTvCountDown(countDownTime);   
  22.               time = RETRY_INTERVAL;   
  23.           }   
  24.     }).start();   
  25. }   
  26. //在主线程上更新tvCountDown   
  27. private void upDateTvCountDown(final String countDownTime) {   
  28.           runOnUiThread( new Runnable() {   
  29.                 @Override   
  30.                 public void run() {   
  31.                  tvCountDown.setText(Html. fromHtml(countDownTime));   
  32.                  tvCountDown.setEnabled( false);   
  33.                }   
  34.           });   
  35.     }   

总结:其实使用聚合数据的短信验证码功能,主要就两个方法,一个是获取验证码的方法sendCaptcha,一个是提交验证码进行验证的方法commitCaptcha。我们在此基础上,可以根据需求对界面进行更改。以上就是对短信验证码的主要逻辑进行的介绍。

作者:tinna

来源:51CTO

时间: 2024-10-02 11:24:16

Android开发之短信验证码示例的相关文章

Android开发获取短信的内容并截取短信_Android

1.首先我们要写一个广播接收器,当我们的手机收到短信时,系统会自动发送一个广播,我们只需要接收到这条广播就可以了 2.在广播里面,我们重写的onReceive()方法,通过里面的Intent写到的Bundle就可以拿到短信的内容, 3.清单文件里面我们必须要添加权限,否则无法接收到. 4.为了防止我们的广播接收不到,我们自己写的广播接收器的权限必须要大,以防万一,我设置了1000. 下面上代码,里面的注释也比较详细.. <?xml version="." encoding=&qu

Android自动获取短信验证码功能

先给大家展示下效果图,如果大家感觉不错,请参考实现代码. 1.自定义监听类 /** * 短信监听器,用于自动填充验证码 */ public class SMSContentObserver extends ContentObserver { public final String SMS_URI_INBOX = "content://sms/inbox";//收信箱 private Activity activity = null; private String smsContent

Android实现发送短信验证码倒计时功能示例

一.简介: 开发中在用户注册或找回密码之类的功能,经常会遇到获取短信验证码,获取验证码后需要等待1分钟倒计时,这段时间是不能再次发送短信请求的. 效果图: 二.实现步骤: 1.一个关键类:CountDownTimer(Android系统自带的倒计时功能类) public class CountDownTimerUtils extends CountDownTimer { private TextView mTextView; //显示倒计时的文字 /** * @param textView Th

Android实现自动提取短信验证码功能_Android

本文实例讲解了Android自动提取短信验证码解决方案,分享给大家供大家参考,具体内容如下 主要功能及优点 1.收到验证码短信后,自动提取短信中的验证码填写到相应输入框 2.可指定一个号码,只读取与他有关短信,避免提取来源错误 3.利用正则表达式,可匹配各种类型验证码 模块集成关键步骤     将auto_getcode_demo中src包里的SMSContentObserver类复制到你的项目src包中    在SMSContentObserver中:    修改正则表达式内容来匹配自己想要获

Android自动获取短信验证码

前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. android上获取短信信息主要有BroadcastReceiver方式与数据库方式,要实时的话就BroadcastReceiver比较方便 public class SMSReceiver extends BroadcastReceiver{    private String verifyCode="&quo

Android实现获取短信验证码并自动填写功能

本文实例为大家分享了Android短信验证码获取并自动填写功能的具体代码,供大家参考,具体内容如下 代码如下: MainActivity public class MainActivity extends AppCompatActivity { public static TextView mText; private SmsContent content; @Override protected void onCreate(Bundle savedInstanceState) { super.

Android利用CursorLoader实现短信验证码自动填写_Android

概述 Android上实现短信验证码自动填写,常用的有两种方式.一种是利用BroadCastReceiver,还有一种是监听手机上短信数据库的变化.利用BroadCastReceiver来实现会在一些情况下无效,最常见的就是手机上安装了具有垃圾短信拦截功能的软件的情况下,短信验证码自动填写无效.所以,现在一般会选用监听数据库内容变化的方式来实现短信验证码自动填写. 网上对于利用监听数据库内容变化来实现短信验证码自动填写的文章也很多,主要分为一下步骤: 1. 继承ContentObserver实现

Android实现短信验证码自动填写功能_Android

android应用经常会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,通常,用户收到短信需要最小化应用去查看短信再填入验证码,必然比较麻烦,因此有必要能够自动获得下发的短信验证码,方便了用户的操作,用户体验更好. 原理讲解: 主要就是实时获取短信信息.涉及到ContentObserver类的使用.使用ContentProvider来监听短信数据库的变化,在自定义的ContentObserver当中实现onChange的方法进行监听特定手机号的短信,然后进行信息截取在填

Android利用CursorLoader实现短信验证码自动填写

概述 Android上实现短信验证码自动填写,常用的有两种方式.一种是利用BroadCastReceiver,还有一种是监听手机上短信数据库的变化.利用BroadCastReceiver来实现会在一些情况下无效,最常见的就是手机上安装了具有垃圾短信拦截功能的软件的情况下,短信验证码自动填写无效.所以,现在一般会选用监听数据库内容变化的方式来实现短信验证码自动填写. 网上对于利用监听数据库内容变化来实现短信验证码自动填写的文章也很多,主要分为一下步骤: 1. 继承ContentObserver实现