Android短信验证码

 我们经常在一个app注册的时候需要使用到短信验证码,输入一个手机号码,点击获取验证码,手机就能收到一条短信,输入短信中的验证码就能验证成功进而进行一些操作。

     Android短信验证码

 当然现在提供短信服务的也有很多,我们选择一个免费的sdk平台Mob,如果有问题还可以咨询技术支持,服务还挺好的。但是因为是免费的,所以还是有一些限制吧,如果是作为测试的话,一个手机号码最多只能收到不到10次验证码,超过10次就不发送了,这时你就要换一个手机号码去接收验证码。 

官网地址: http://www.mob.com/#/  该平台还提供其他的一些服务,有需要的可以挖掘。

Android短信验证码

当然你还是要注册一个账户,然后申请一个app,获取到app key 和app  secret, 这个在你的项目里面需要用到,如图中的SecurityCodeSDK

Android短信验证码

然后下载sdk。下图就是Android sdk下载的页面, 可以看到我们可以根据IDE选择不同的sdk,我下载的就是Android studio的sdk,

Android短信验证码

下载完成之后解压出来,可以获取到如下的四个jar包, 还有一个txt文件, txt文件是添加sdk到工程的方法。

Android短信验证码

先把这四个jar包拷贝到项目的libs文件夹下,然后在gradle文件中添加如下红色部分

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"
    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

repositories {
    flatDir{
        dirs 'libs'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.0'
    compile name:'SMSSDK-2.1.2',ext:'aar'
    compile name:'SMSSDKGUI-2.1.2',ext:'aar'
    testCompile 'junit:junit:4.12'
}

然后还要在AndroidManifest.xml文件中添加如下的activity:

[html] view plain copy
  1. <activity  
  2.             android:name="com.mob.tools.MobUIShell"  
  3.             android:configChanges="keyboardHidden|orientation|screenSize"  
  4.             android:theme="@android:style/Theme.Translucent.NoTitleBar"  
  5.             android:windowSoftInputMode="stateHidden|adjustResize"/>  

布局文件很简单,就两个textiew和两个button,下面贴上主代码:


[java] view plain copy
  1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {  
  2.   
  3.     private static final String TAG = "SmsYanzheng";  
  4.     EditText mEditTextPhoneNumber;  
  5.     EditText mEditTextCode;  
  6.     Button mButtonGetCode;  
  7.     Button mButtonLogin;  
  8.   
  9.     EventHandler eventHandler;  
  10.     String strPhoneNumber;  
  11.   
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.activity_main);  
  16.   
  17.         mEditTextPhoneNumber = (EditText) findViewById(R.id.phone_number);  
  18.         mEditTextCode = (EditText) findViewById(R.id.verification_code);  
  19.         mButtonGetCode = (Button) findViewById(R.id.button_send_verification_code);  
  20.         mButtonLogin = (Button) findViewById(R.id.button_login);  
  21.   
  22.         mButtonGetCode.setOnClickListener(this);  
  23.         mButtonLogin.setOnClickListener(this);  
  24.   
  25.         SMSSDK.initSDK(this"app key""app secret"); //使用你申请的key 和 secret  
  26.   
  27.         eventHandler = new EventHandler() {  
  28.   
  29.             /** 
  30.              * 在操作之后被触发 
  31.              * 
  32.              * @param event  参数1 
  33.              * @param result 参数2 SMSSDK.RESULT_COMPLETE表示操作成功,为SMSSDK.RESULT_ERROR表示操作失败 
  34.              * @param data   事件操作的结果 
  35.              */  
  36.   
  37.             @Override  
  38.             public void afterEvent(int event, int result, Object data) {  
  39.                 Message message = myHandler.obtainMessage(0x00);  
  40.                 message.arg1 = event;  
  41.                 message.arg2 = result;  
  42.                 message.obj = data;  
  43.                 myHandler.sendMessage(message);  
  44.             }  
  45.         };  
  46.   
  47.         SMSSDK.registerEventHandler(eventHandler);  
  48.     }  
  49.   
  50.     @Override  
  51.     protected void onDestroy() {  
  52.         super.onDestroy();  
  53.         SMSSDK.unregisterEventHandler(eventHandler);  
  54.     }  
  55.   
  56.     @Override  
  57.     public void onClick(View view) {  
  58.         if (view.getId() == R.id.button_login) {  
  59.             String strCode = mEditTextCode.getText().toString();  
  60.             if (null != strCode && strCode.length() == 4) {  
  61.                 Log.d(TAG, mEditTextCode.getText().toString());  
  62.                 SMSSDK.submitVerificationCode("86", strPhoneNumber, mEditTextCode.getText().toString());  
  63.             } else {  
  64.                 Toast.makeText(this"密码长度不正确", Toast.LENGTH_SHORT).show();  
  65.             }  
  66.         } else if (view.getId() == R.id.button_send_verification_code) {  
  67.             strPhoneNumber = mEditTextPhoneNumber.getText().toString();  
  68.             if (null == strPhoneNumber || "".equals(strPhoneNumber) || strPhoneNumber.length() != 11) {  
  69.                 Toast.makeText(this"电话号码输入有误", Toast.LENGTH_SHORT).show();  
  70.                 return;  
  71.             }  
  72.             SMSSDK.getVerificationCode("86", strPhoneNumber);  
  73.             mButtonGetCode.setClickable(false);  
  74.             //开启线程去更新button的text  
  75.             new Thread() {  
  76.                 @Override  
  77.                 public void run() {  
  78.                     int totalTime = 60;  
  79.                     for (int i = 0; i < totalTime; i++) {  
  80.                         Message message = myHandler.obtainMessage(0x01);  
  81.                         message.arg1 = totalTime - i;  
  82.                         myHandler.sendMessage(message);  
  83.                         try {  
  84.                             sleep(1000);  
  85.                         } catch (InterruptedException e) {  
  86.                             e.printStackTrace();  
  87.                         }  
  88.                     }  
  89.                     myHandler.sendEmptyMessage(0x02);  
  90.                 }  
  91.             }.start();  
  92.         }  
  93.     }  
  94.   
  95.     Handler myHandler = new Handler() {  
  96.         @Override  
  97.         public void handleMessage(Message msg) {  
  98.             switch (msg.what) {  
  99.                 case 0x00:  
  100.                     int event = msg.arg1;  
  101.                     int result = msg.arg2;  
  102.                     Object data = msg.obj;  
  103.                     Log.e(TAG, "result : " + result + ", event: " + event + ", data : " + data);  
  104.                     if (result == SMSSDK.RESULT_COMPLETE) { //回调  当返回的结果是complete  
  105.                         if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { //获取验证码  
  106.                             Toast.makeText(MainActivity.this"发送验证码成功", Toast.LENGTH_SHORT).show();  
  107.                             Log.d(TAG, "get verification code successful.");  
  108.                         } else if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { //提交验证码  
  109.                             Log.d(TAG, "submit code successful");  
  110.                             Toast.makeText(MainActivity.this"提交验证码成功", Toast.LENGTH_SHORT).show();  
  111.                             Intent intent = new Intent(MainActivity.this, SecondActivity.class);  
  112.                             startActivity(intent);  
  113.                         } else {  
  114.                             Log.d(TAG, data.toString());  
  115.                         }  
  116.                     } else { //进行操作出错,通过下面的信息区分析错误原因  
  117.                         try {  
  118.                             Throwable throwable = (Throwable) data;  
  119.                             throwable.printStackTrace();  
  120.                             JSONObject object = new JSONObject(throwable.getMessage());  
  121.                             String des = object.optString("detail");//错误描述  
  122.                             int status = object.optInt("status");//错误代码  
  123.                             //错误代码:  http://wiki.mob.com/android-api-%E9%94%99%E8%AF%AF%E7%A0%81%E5%8F%82%E8%80%83/  
  124.                             Log.e(TAG, "status: " + status + ", detail: " + des);  
  125.                             if (status > 0 && !TextUtils.isEmpty(des)) {  
  126.                                 Toast.makeText(MainActivity.this, des, Toast.LENGTH_SHORT).show();  
  127.                                 return;  
  128.                             }  
  129.                         } catch (Exception e) {  
  130.                             e.printStackTrace();  
  131.                         }  
  132.                     }  
  133.                     break;  
  134.                 case 0x01:  
  135.                     mButtonGetCode.setText("重新发送(" + msg.arg1 + ")");  
  136.                     break;  
  137.                 case 0x02:  
  138.                     mButtonGetCode.setText("获取验证码");  
  139.                     mButtonGetCode.setClickable(true);  
  140.                     break;  
  141.             }  
  142.         }  
  143.     };  
  144. }  

当然还需要在AndroidManifest文件中声明权限:
[html] view plain copy
  1. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  
  2. <uses-permission android:name="android.permission.RECEIVE_SMS"/>  
  3. <uses-permission android:name="android.permission.READ_SMS"/>  
  4. <uses-permission android:name="android.permission.READ_CONTACTS"/>  
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
  6. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  
  7.   
  8.   
  9. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
  10. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
  11. <uses-permission android:name="android.permission.INTERNET"/>  
  12. <uses-permission android:name="android.permission.GET_TASKS"/>  

现在就可以测试手机能不能获取到验证码了,当然,前提是需要手机能访问网络。

还有详细的方法的用法和指导,可以直接区mob官网自行查询。

代码下载:github