Android短信验证码-使用mob免费版

参考:http://www.apkbus.com/blog-944804-76968.html

https://blog.csdn.net/ifreeboard/article/details/53965580

http://wiki.mob.com/sdk-sms-android-3-0-0/

http://wiki.mob.com/sms-android-%E6%97%A0gui%E6%8E%A5%E5%8F%A3%E8%B0%83%E7%94%A8/

效果:


需要额外添加依赖:

 implementation 'com.jakewharton:butterknife:8.8.1'
  annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

代码:

package com.example.mvpfour.activity;

import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
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 com.example.mvpfour.R;

import java.util.concurrent.TimeUnit;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;

import static cn.smssdk.SMSSDK.getSupportedCountries;
import static cn.smssdk.SMSSDK.getVerificationCode;
import static cn.smssdk.SMSSDK.submitVerificationCode;

/**
 * Created by agen on 2018/6/23.
 */

public class SmsCodeActivity extends AppCompatActivity {
    private static final String TAG = "GsonUtils";
    @BindView(R.id.et_phone)
    EditText etPhone;
    @BindView(R.id.bt_getCode)
    Button btGetCode;
    @BindView(R.id.et_code)
    EditText etCode;
    @BindView(R.id.bt_verify)
    Button btVerify;
    private EventHandler eh;

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            int result = msg.arg2;
            int event = msg.arg1;
            Object data = msg.obj;
            if (result == SMSSDK.RESULT_COMPLETE) {
                //回调完成
                //回调完成
                // 处理你自己的逻辑
               Log.d(TAG,"RESULT_COMPLETE");
                if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
                    //提交验证码成功
                   Log.d(TAG,"提交验证码成功-EVENT_SUBMIT_VERIFICATION_CODE" + data.toString());
                    //客户端验证成功,可以进行注册,返回校验的手机和国家代码phone/country
                    Toast.makeText(SmsCodeActivity.this, "提交验证码成功", Toast.LENGTH_SHORT).show();
                } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
                   Log.d(TAG,"获取验证码成功-EVENT_GET_VERIFICATION_CODE" + data.toString());
                    //获取验证码成功
                    Toast.makeText(SmsCodeActivity.this, "获取验证码成功", Toast.LENGTH_SHORT).show();
                    Message message = new Message();
                } else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {
                    //返回支持发送验证码的国家列表
                   Log.d(TAG,"EVENT_GET_SUPPORTED_COUNTRIES=" + data.toString());
                }
            } else {
                Toast.makeText(SmsCodeActivity.this, "验证失败", Toast.LENGTH_SHORT).show();
                ((Throwable) data).printStackTrace();
                Log.d(TAG,((Throwable) data).getMessage());
            }
        }
    };
    private String phone;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.smscode_activity);
        ButterKnife.bind(this);
        //注册回调监听,放到发送和验证前注册,注意这里是子线程需要传到主线程中去操作后续提示
        eh = 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;
                mHandler.sendMessage(msg);
            }

        };
        SMSSDK.registerEventHandler(eh);
    }

    @OnClick({R.id.bt_getCode,
            R.id.bt_verify,
    })
    public void function(View view) {
        int id = view.getId();
        if (R.id.bt_getCode == id) {
            phone = etPhone.getText().toString().trim();
            if (TextUtils.isEmpty(phone)) {
                Toast.makeText(this, "请输入手机号", Toast.LENGTH_SHORT).show();
                return;
            }
            if (isMobileNO(phone)) {
                timeCountDown();
                getSupportedCountries();
                getVerificationCode("86", phone);
            } else {
                //手机号格式有误
                Toast.makeText(this, "手机号格式错误,请检查", Toast.LENGTH_SHORT).show();
            }

        } else if (R.id.bt_verify == id) {
            String code = etCode.getText().toString().trim();
            if (TextUtils.isEmpty(code)) {
                Toast.makeText(this, "输入验证码", Toast.LENGTH_SHORT).show();
                return;
            }
            //填写了验证码,进行验证
            Log.d(TAG,"phone="+phone);
            submitVerificationCode("86", phone, code);
        }
    }

    /**
     * 短信验证码倒计时
     * 使用Rxjava
     */
    private void timeCountDown() {
        final int count = 60;
        Observable.interval(0, 1, TimeUnit.SECONDS)
                .take(count + 1) //设置循环31次
                //进行数据转换
                .map(new Function<Long, Long>() {
                    @Override
                    public Long apply(Long aLong) throws Exception {
                       Log.d(TAG,"along=" + aLong);
                        //aLong是原来的值0,1,2
                        //返回倒计时的值30,29,28
                        return count - aLong;
                    }
                })
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                       Log.d(TAG,"accept");
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Long>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                       Log.d(TAG,"onSubscribe=");

                    }

                    @Override
                    public void onNext(Long aLong) {
                        btGetCode.setEnabled(false);//在发送数据的时候设置为不能点击
                        btGetCode.setTextColor(Color.WHITE);
                        btGetCode.setBackgroundColor(Color.GRAY);//背景色设为灰色
                       Log.d(TAG,"onNext: " + aLong);
                        btGetCode.setText("剩余时间" + aLong + "秒");
                    }

                    @Override
                    public void onError(Throwable e) {
                       Log.d(TAG,"onError=" + e.toString());
                    }

                    @Override
                    public void onComplete() {
                       Log.d(TAG,"onCompleted: ");
                        btGetCode.setText("获取验证码");//数据发送完后设置为原来的文字
                        btGetCode.setTextColor(Color.BLACK);
                        btGetCode.setEnabled(true);
                        btGetCode.setBackgroundColor(Color.parseColor("#f97e7e"));//数据发送完后设置为原来背景色
                    }
                })
        ;
    }


    // 请求验证码,其中country表示国家代码,如“86”;phone表示手机号码,如“13800138000”
    //    SMSSDK.getVerificationCode(country, phone);

    // 提交验证码,其中的code表示验证码,如“1357”
    //    SMSSDK.submitVerificationCode(country, phone, code);

    protected void onStop() {
        super.onStop();
        //不能写在这里,不然查看短信后,监听短信的回调失效
    }

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

    private boolean isMobileNO(String phone) {
       /*
    总结起来就是第一位必定为1,第二位必定为345789,其他位置的可以为0-9
    */
        String telRegex = "[1][345789]\\d{9}";//"[1]"代表第1位为数字1,"[358]"代表第二位可以为3、5、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。
        if (TextUtils.isEmpty(phone))
            return false;
        else
            return phone.matches(telRegex);
    }


}

。。。

猜你喜欢

转载自blog.csdn.net/dianziagen/article/details/80784440