Android集成获取短信验证码功能

前言

很多时候我们都会用到短信验证登陆注册等一些列功能,于是最近花时间研究了一下,因为很多都是需要收取一定费用,所以我选择了Mob开发平台,网上也有很多相关教程,我选择了最新的 SMS For Android Eclipse v3.1.1   在线gradle集成方式,并将自己的心得与方法分享给大家。
准备

我们需要在Mob开发者平台 http://www.mob.com/ 上注册一个账号,并且创建应用获取到该应用的App信息,如下图所示:

然后根据官方文档将相关代码添加到你的build.gradle文件下
这儿给大家补充一下,第一步中的gradle是你整个工程的gradle,第二个是App文件夹里面的gradle,如图:

添加完成之后编译就可以用了。

开始

 下面就是相关代码的实现,由于官方文档给的太过简单,所以我做了一些修改。
先看布局文件:两个EditText两个Button,大家可以根据自己需要修改,就不多说了
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="20dp">

        <TextView
            android:paddingLeft="10dp"
            android:id="@+id/country_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="@string/country_text"
            android:textSize="24sp" />

        <EditText
            android:id="@+id/phone_ed"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="phone"
            android:padding="10dp" />

        <Button
            android:id="@+id/button_send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/send_btn" />

        <EditText
            android:id="@+id/code_ed"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp" />

        <Button
            android:id="@+id/btn_check"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/check_btn" />
    </LinearLayout>
</LinearLayout>

效果:
初始化控件,不多说
    private void initView() {
        btn_send = findViewById(R.id.button_send);
        ed_phone = findViewById(R.id.phone_ed);
        text_country = findViewById(R.id.country_text);
        code_ed = findViewById(R.id.code_ed);
        btn_check = findViewById(R.id.btn_check);
        //
        btn_send.setOnClickListener(this);
        btn_check.setOnClickListener(this);
    }

然后我们看OnCick方法中,首先我写了一个方法,用来发送验证码,后面是一个Thread,用来进行计时,后面是检验验证码是否正确的button监听

 @Override
    public void onClick(View view) {
        //发送验证码
        if (view == btn_send) {
            //检验手机号是否填写
            if (TextUtils.isEmpty(ed_phone.getText().toString())) {
                Toast.makeText(this, "手机号码不能为空",
                        Toast.LENGTH_SHORT).show();
                return;
            }
            //发送验证码
            sendCode(text_country.getText().toString()
                    , ed_phone.getText().toString());
            btn_send.setClickable(false);
            //启用Thread用来倒计时
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (; countdown > 0; countdown--) {
                        handler.sendEmptyMessage(-1); //发送消息
                        if (countdown <= 0) {
                            break;
                        }
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    //倒计时结束执行
                    handler.sendEmptyMessage(-2);
                }
            }).start();

        }
        //检验验证码是否发送成功
        if (view == btn_check) {
            if(TextUtils.isEmpty(ed_phone.getText().toString())){
                Toast.makeText(this, "手机号码不能为空",
                        Toast.LENGTH_SHORT).show();
                return;
            }
            if(TextUtils.isEmpty(code_ed.getText().toString())){
                Toast.makeText(this, "验证码不能为空",
                        Toast.LENGTH_SHORT).show();
                return;
            }
            //检验是否发送成功
            SMSSDK.submitVerificationCode("86", ed_phone.getText().toString(), code_ed.getText().toString());
        }
    }

接下来是sendCode方法,用来发送验证码

  /**
     * 发送验证码
     * country: 国家"+86"
     * phone: 手机号
     */
    public void sendCode(String country, String phone) {
        //registerEventHandler是用来往SMSSDK中注册一个事件接收器。
        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);
        //绑定国家country,与手机号phone
        SMSSDK.getVerificationCode(country, phone);
    }

之创建一个Handler,用来更新UI和完成验证的一些操作

 /**
     * 由于EventHandler开启了线程不能直接在afterEvent中更新UI
     * 所以还需要在MainActivity当中定义一个Handler
     * 来接受EventHandler发送过来的消息
     */
    @SuppressLint("HandlerLeak")
    Handler handler = new Handler() {
        //主线程中更新UI
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == -1) {
                //更新倒计时
                btn_send.setText(countdown + "s后重发");
            } else if (msg.what == -2) {
                //修改控件文本,进行重新发送验证码
                btn_send.setText("重新发送");
                btn_send.setClickable(true);
                countdown = 60;
            } else {
                int event = msg.arg1;
                int result = msg.arg2;
                Object data = msg.obj;
                // 验证成功,后可在此调用后续方法
                if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
                    Toast.makeText(getApplicationContext(), "验证成功",
                            Toast.LENGTH_SHORT).show();
                }
                //验证码发送成功
                else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {

                    Toast.makeText(getApplicationContext(), "验证码已经发送",
                            Toast.LENGTH_SHORT).show();
                }
                //验证码发送出错
                else if (result == SMSSDK.RESULT_ERROR) {
                    try {
                        Throwable throwable = (Throwable) data;
                        throwable.printStackTrace();
                        JSONObject object = new JSONObject(throwable.getMessage());
                        String des = object.optString("detail");//错误描述
                        int status = object.optInt("status");//错误代码
                        if (status > 0 && !TextUtils.isEmpty(des)) {
                            Toast.makeText(MainActivity.this, des, Toast.LENGTH_SHORT).show();
                            return;
                        }
                    } catch (Exception e) {
                        //do something
                    }

                }

            }
        }


    };

最后别忘了需要onDestroy中销毁

    protected void onDestroy() {
        super.onDestroy();
        //用完回调要注销掉,否则可能会出现内存泄露
        SMSSDK.unregisterAllEventHandler();
    }

好了,章到这儿就结束了,总体来说, v3.1.1版本的集成方式相比SDK离线集成省去了很多时间,官方也提供了说明文档,希望大家都能弄好,共同进步。
我写了一份关于短信集成的Demo,使用方法很简单,只需要将自己的appKey换上就可以使用了。有需要的同学点下面下载:
附一份官方给的Demo  : 点击打开链接

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值