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

和室友参加的互联网大赛要做一个 APP,涉及到用户的登录注册,于是上网找了许多资料,其中有阿里大于,网易云等等,阿里大于的客服给我说他们不支持 Android,网易云还要拍手持身份证的照片,而且这两个都收费,还麻烦,于是找了一个既简单有免费的,叫做 Mob,官网如下

Mob 官网

官方文档看了很多,还是觉得写的不好,于是自己写一篇。

注册账号

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

添加应用

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

概况

AppKey 和 AppSecret 一会会用到

下载 SDK

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

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

目录结构

要用到的 SDK 在 SMSSDK 文件夹中

导入 SDK 到工程目录

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

导入 libs

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

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

repositories{
    flatDir{
        dirs 'libs'
    }
}
compile name:'SMSSDK-2.1.4',ext:'aar'
compile name:'SMSSDKGUI-2.1.4',ext:'aar'

最后看起来是这样的

添加完依赖库的 build.gradle

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

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

<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" />

程序代码

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

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
        final String AppKey = "你的 AppKey";                       // AppKey
        final String AppSecret = "你的 AppSecret"; // AppSecret

        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);     // 注册回调接口
    }

    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 就可以了。

注意

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 中。

发送短信验证码的语句是 

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

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

>```
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 条,所以,省着点用,当然你可以在应用管理界面申请上线登记(见第一张图),审核通过后就完全免费了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容