参考: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); } }
。。。