安卓使用Mob实现短信验证登录代码 很简单

来源:互联网 发布:mysql insert日期格式 编辑:程序博客网 时间:2024/05/16 00:32

Android用 Mob 实现发送短信验证码实例



注册账号

在 Mob 官网右上角点击注册,依次填入信息,其中公司一栏可以随便填

添加应用

登录后,点击 SecurityCodeSDK - 立即使用,Mob 会提示你添加应用,名字自己填,再选 Android,添加完后再点击 SecurityCodeSDk - 进入,之后应该可以看到如下界面

AppKey 和 AppSecret 一会会用到

下载 SDK

在网页上方“下载SDK”中点击“免费短信验证码SDK”,网页跳转后找到“短信验证码SDK”,根据需要选择系统吧,我做的 Android 就选 Android,网页跳转后根据需要选择 AndroidStudio 或者 eclipse,在屏幕右方选择,选好后点击即可开始下载。

下好后解压,打开文件夹,目录结构如下


要用到的 SDK 在 SMSSDK 文件夹中

导入 SDK 到工程目录

打开 SMSSDK 文件夹,把两个 .jar 和 .aar 文件复制到工程目录中 libs 文件夹下,如图所示


粘贴进去后,选中两个 .jar 文件,右键点击,选择 add as library

再打开 app 目录下的 build.gradle,添加如下两处内容

1
2
3
4
5
repositories{
  flatDir{
    dirs 'libs'
  }
}
1
2
compile name:'SMSSDK-2.1.4',ext:'aar'
compile name:'SMSSDKGUI-2.1.4',ext:'aar'

最后看起来是这样的


添加的代码为 22-26 行和 36-37 行。

打开 AndroidManifest.xml,添加如下权限

1
2
3
4
5
6
7
8
9
10
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<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.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />



最终,你的AndroidManifest.xml看起来应该像这样:



程序代码

先把完整代码贴出来(没贴 xml,这个不影响)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
public class Register extends AppCompatActivity implements View.OnClickListener {
 
  private EditText etPhoneNumber;    // 电话号码
  private Button sendVerificationCode;  // 发送验证码
  private EditText etVerificationCode;  // 验证码
  private Button nextStep;        // 下一步
 
  private String phoneNumber;     // 电话号码
  private String verificationCode;  // 验证码
 
  private boolean flag;  // 操作是否成功
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);
 
    init(); // 初始化控件、注册点击事件
 
    final Context context = Register.this;            // context
  
    EventHandler eventHandler = new EventHandler(){    // 操作回调
      @Override
      public void afterEvent(int event, int result, Object data) {
        Message msg = new Message();
        msg.arg1 = event;
        msg.arg2 = result;
        msg.obj = data;
        handler.sendMessage(msg);
      }
    };
    SMSSDK.registerEventHandler(eventHandler);   // 注册回调接口
  }
 
  private void init() {
    etPhoneNumber = (EditText) findViewById(R.id.edit_phone_number);
    sendVerificationCode = (Button) findViewById(R.id.btn_send_verification_code);
    etVerificationCode = (EditText) findViewById(R.id.edit_verification_code);
    nextStep = (Button) findViewById(R.id.btn_next_step);
    sendVerificationCode.setOnClickListener(this);
    nextStep.setOnClickListener(this);
  }
 
  @Override
  public void onClick(View v) {
    switch (v.getId()) {
      case R.id.btn_send_verification_code:
        if (!TextUtils.isEmpty(etPhoneNumber.getText())) {
          if (etPhoneNumber.getText().length() == 11) {
            phoneNumber = etPhoneNumber.getText().toString();
            SMSSDK.getVerificationCode("86", phoneNumber); // 发送验证码给号码的 phoneNumber 的手机
            etVerificationCode.requestFocus();
          }
          else {
            Toast.makeText(this"请输入完整的电话号码", Toast.LENGTH_SHORT).show();
            etPhoneNumber.requestFocus();
          }
        else {
          Toast.makeText(this"请输入电话号码", Toast.LENGTH_SHORT).show();
          etPhoneNumber.requestFocus();
        }
        break;
 
      case R.id.btn_next_step:
        if (!TextUtils.isEmpty(etVerificationCode.getText())) {
          if (etVerificationCode.getText().length() == 4) {
            verificationCode = etVerificationCode.getText().toString();
            SMSSDK.submitVerificationCode("86", phoneNumber, verificationCode);
            flag = false;
          else {
            Toast.makeText(this"请输入完整的验证码", Toast.LENGTH_SHORT).show();
            etVerificationCode.requestFocus();
          }
        else {
          Toast.makeText(this"请输入验证码", Toast.LENGTH_SHORT).show();
          etVerificationCode.requestFocus();
        }
        break;
 
      default:
        break;
    }
  }
 
  Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
      int event = msg.arg1;
      int result = msg.arg2;
      Object data = msg.obj;
 
      if (result == SMSSDK.RESULT_COMPLETE) {
        // 如果操作成功
        if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
          // 校验验证码,返回校验的手机和国家代码
          Toast.makeText(Register.this"验证成功", Toast.LENGTH_SHORT).show();
          Intent intent = new Intent(Register.this, MainActivity.class);
          startActivity(intent);
        else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
          // 获取验证码成功,true为智能验证,false为普通下发短信
          Toast.makeText(Register.this"验证码已发送", Toast.LENGTH_SHORT).show();
        else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {
          // 返回支持发送验证码的国家列表
        }
      else {
        // 如果操作失败
        if (flag) {
          Toast.makeText(Register.this"验证码获取失败,请重新获取", Toast.LENGTH_SHORT).show();
          etPhoneNumber.requestFocus();
        else {
          ((Throwable) data).printStackTrace();
          Toast.makeText(Register.this"验证码错误", Toast.LENGTH_SHORT).show();
        }
      }
    }
  };
 
  @Override
  protected void onDestroy() {
    super.onDestroy();
    SMSSDK.unregisterAllEventHandler(); // 注销回调接口
  }
}

注意要把你的 AppKey 和 AppSecret 替换进去。

其实看过很多教程你会发现,很多时候并不是代码看不懂,而是在配置文件的时候出了问题,因为一个刚接触 Android 没两天的人是不可能对很多第三方 SDK 有需求的,一开始都是以基础为主,所以需要配置第三方 SDK 的很多都是写过一些 Android 代码的人,他们所关心的其实就是该调用哪些方法来实现自己的目的,所以知道怎么调用就行了,再根据实际需求写几个 if-else 就可以了。

注意

1
2
3
4
5
6
7
8
9
10
11
12
SMSSDK.initSDK(context, AppKey, AppSecret);      // 初始化 SDK 单例,可以多次调用
EventHandler eventHandler = new EventHandler(){    // 操作回调
  @Override
  public void afterEvent(int event, int result, Object data) {
    Message msg = new Message();
    msg.arg1 = event;
    msg.arg2 = result;
    msg.obj = data;
    handler.sendMessage(msg);
  }
};
SMSSDK.registerEventHandler(eventHandler);   // 注册回调接口

这几行代码是调用这个 SDK 的基础,写在 onCreate 中。

发送短信验证码的语句是

1
SMSSDK.getVerificationCode("86", phoneNumber);

phoneNumber 的取值取决于用户输入的号码,“86”是中国的区号,根据需求也可以让用户自己选择,稍微修改一下就行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if (result == SMSSDK.RESULT_COMPLETE) {
  // 如果操作成功
  if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
  // 校验验证码,返回校验的手机和国家代码
    Toast.makeText(Register.this"验证成功", Toast.LENGTH_SHORT).show();
    Intent intent = new Intent(Register.this, MainActivity.class);
    startActivity(intent);
  else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
    // 获取验证码成功,true为智能验证,false为普通下发短信
    Toast.makeText(Register.this"验证码已发送", Toast.LENGTH_SHORT).show();
  else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {
    // 返回支持发送验证码的国家列表
  }
else {
  // 如果操作失败
  if (flag) {
    Toast.makeText(Register.this"验证码获取失败,请重新获取", Toast.LENGTH_SHORT).show();
    etPhoneNumber.requestFocus();
  else {
    ((Throwable) data).printStackTrace();
    Toast.makeText(Register.this"验证码错误", Toast.LENGTH_SHORT).show();
  }
}

这几行代码判断验证码发没发送以及正不正确,根据 event 来确定是哪一种情况,如果想深入了解,可以参考官方文档

Android 短信SDK操作回调

当然,免费服务肯定收费的要差点,体现在短信发的比收费的慢,大概要十秒才能收到,收费的三秒就收到了,由于只是个比赛,自己做着玩,用免费的足矣。

另外,最开始免费的时候每天只能发 20 条短信,而且一个手机号每 12 小时只能收到 5 条,所以,省着点用,当然你可以在应用管理界面申请上线登记(见第一张图),审核通过后就完全免费了。