本人也是刚入安卓,今天学到了短信验证这一块。在平时我们接触的很多APP注册(登录)都需要短信验证,所以突然就想到写一篇博客,一来是巩固知识,方便自己查阅。二来是和大家伙们一起分享下,给需要的朋友一点自己的见解。
下面就开始表演了:
提供短信服务的很多,我用的是免费的Mob,很适合自己平时测试或者在个人的小项目中使用,但是上线前每个手机号一天有次数限制、短信内容不能自定义。
Mob官网:http://www.mob.com/
1:注册一个账号,申请App,因为我们后边会用到他的 AppKey 和 App Secret 。
2: 下载SDK , 下载很简单就不贴图了。 点击SDK下载 --> 短信验证码SDK --> 当然是选择安装了。 下载好解压后会有四个Jar包,如下图。
3:在项目libs中导入这四个Jar包,并且在build.gradle文件中添加如下代码:
repositories {
flatDir {
dirs 'libs'
}
}
compile name: 'SMSSDK-2.1.2', ext: 'aar'
compile name: 'SMSSDKGUI-2.1.2', ext: 'aar'
如图:

4:然后在AndroidManifest.xml中添加如下代码 :
<activity
android:name="com.mob.tools.MobUIShell"
android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="stateHidden|adjustResize" />
5:下面就是布局文件了: 两个EditText ,两个Button 。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.administrator.mob_demo.MainActivity">
<EditText
android:id="@+id/Shoujihao"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号"
android:theme="@style/MyEdit"
/>
<EditText
android:id="@+id/Yanzhengma"
android:layout_width="250dp"
android:layout_height="50dp"
android:hint="请输入验证码"
android:layout_below="@+id/Shoujihao"
/>
<Button
android:id="@+id/Huoqu"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/Yanzhengma"
android:layout_below="@+id/Shoujihao"
android:text="获取验证码"
/>
<Button
android:id="@+id/Denglu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/Yanzhengma"
android:text="登录"
/>
</RelativeLayout>
效果如下:
6:该MainActivity里的主代码了:
package com.example.administrator.mob_demo;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import org.json.JSONObject;
import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private static final String TAG = "SmsYanZheng";
EditText EdS;
EditText EdY;
Button BtnH;
Button BtnD;
EventHandler eventHandler;
String strPhoneNumber;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EdS = (EditText)findViewById(R.id.Shoujihao);
EdY = (EditText)findViewById(R.id.Yanzhengma);
BtnH = (Button)findViewById(R.id.Huoqu);
BtnD = (Button)findViewById(R.id.Denglu);
BtnH.setOnClickListener(this);
BtnD.setOnClickListener(this);
// 用到的 AppKey 和 App Secret
SMSSDK.initSDK(this,"25ceca8ccd9f8" , "d07319de9b5bc043881e10e59d678589");
eventHandler = new EventHandler(){
/**
* 在操作之后被触发
* @param event 参数1
* @param result 参数2 SMSSDK.RESULT_COMPLETE表示操作成功,为SMSSDK.RESULT_ERROR表示操作失败
* @param data 事件操作的结果
*/
@Override
public void afterEvent(int event, int result, Object data) {
Message message = myHandler.obtainMessage(0x00);
message.arg1 = event;
message.arg2 = result;
message.obj = data;
myHandler.sendMessage(message);
}
};
SMSSDK.registerEventHandler(eventHandler);
}
@Override
protected void onDestroy() {
super.onDestroy();
SMSSDK.unregisterEventHandler(eventHandler);
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.Denglu){
String strCode = EdY.getText().toString();
if (null != strCode && strCode.length() == 4){
Log.d(TAG , EdY.getText().toString());
SMSSDK.submitVerificationCode("86",strPhoneNumber , EdY.getText().toString());
}else {
Toast.makeText(this ,"密码长度不正确", Toast.LENGTH_SHORT ).show();
}
}else if (view.getId() == R.id.Huoqu){
strPhoneNumber = EdS.getText().toString();
if (null == strPhoneNumber || "".equals(strPhoneNumber) || strPhoneNumber.length()!= 11 ){
Toast.makeText(this, "输入电话号码有误" , Toast.LENGTH_SHORT).show();
return;
}
SMSSDK.getVerificationCode("86" , strPhoneNumber);
BtnH.setClickable(false);
//开启线程去更新butto的text
new Thread(){
@Override
public void run() {
int totalTime = 60;
for (int i = 0; i<totalTime; i++){
Message message = myHandler.obtainMessage(0x01);
message.arg1 = totalTime - i;
myHandler.sendMessage(message);
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
myHandler.sendEmptyMessage(0x02);
}
}.start();
}
}
Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 0x00:
int event = msg.arg1;
int result = msg.arg2;
Object data = msg.obj;
Log.e(TAG , "result:" + result +",event:" + event+ ",data:" +data);
//回调 当返回的结果是complete
if (result == SMSSDK.RESULT_COMPLETE){
//获取验证码
if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){
Toast.makeText(MainActivity.this , "发送验证码成功" ,Toast.LENGTH_SHORT).show();
Log.d(TAG , "get verification code successful.");
}else if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE){
//提交验证
Log.d(TAG, "submit code successful");
Toast.makeText(MainActivity.this, "提交验证码成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this ,SecondActivity.class);
startActivity(intent);
}else {
Log.d(TAG, data.toString());
}
}else {
//进行操作出错,通过下面的信息区分析错误原因
try {
Throwable throwable = (Throwable) data;
throwable.printStackTrace();
JSONObject object = new JSONObject(throwable.getMessage());
String des = object.optString("detail");//错误描述
int status = object.optInt("status");//错误代码
Log.e(TAG ,"status:" + status + ",detail:" + des);
if (status > 0 && !TextUtils.isEmpty(des)){
Toast.makeText(MainActivity.this, des, Toast.LENGTH_SHORT).show();
return;
}
} catch (Exception e) {
e.printStackTrace();
}
}
break;
case 0x01:
BtnH.setText("重新发送("+ msg.arg1 + ")");
break;
case 0x02:
BtnH.setText("获取验证码");
BtnH.setClickable(true);
break;
}
}
};
}
Ps: 我上边定义的控件名只是为了方便,我方便看。
7:还需要一个Activity , 当你登录成功后跳转的界面,这个很简单就不贴图了。
8:最后,这是很容易遗忘的,在AndroidManifest文件中声明权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_TASKS" />
至此就结束了,你可以用你的手机测试能不能收到短信,不过是需要网的哦。 成功的图我就不贴了,大家肯定都能做到的。
Ps: 如果有需要的朋友可以去:https://download.youkuaiyun.com/download/liu825562006/10416792 Demo里边包含Jar包。
如有问题留言,会及时回复,后边也会多写写博客,分享一点自己学到的东西,让不知道的朋友也能学习。
谢谢大家!!!