前言

作业需要用到:短信验证码推送(用于注册)。了解到一个免费的手机短信推送平台,就去官网看了看相关API怎么用。

http://www.mob.com/wiki/detailed?wiki=SMSSDK_for_Android_kuaisujicheng&id=23

http://www.mob.com/wiki/detailed?wiki=SMSSDK_for_Android_APIjiekou_wuguijiekoudiaoyong&id=23

文档的无GUI调用示例,好像不是很复杂,就是有点说不清楚。自己摸索和测试了一番,也费了不少时间。

该怎么用?我不太想直接将示例复制到Activity中,跟页面的交互逻辑混杂在一起。这样很容易乱。于是想尽量把这个推送逻辑尽量抽离、独立出来。这样减少代码耦合,阅读方便,以后也方便复用。

测试我自己简单写了个界面(说实话,自己真的烦做界面,这辈子没有艺术思维。。。),主要是测试是否真的能推送功能。

效果图

MsgVerifyView

import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.TextUtils;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import com.mob.MobSDK;import cn.smssdk.EventHandler;import cn.smssdk.SMSSDK;/** * AppCompatActivity可以改成自定义的基类 * @author passerbyYSQ * @create 2020-05-01 14:56 */public abstract class MsgVerifyView extends AppCompatActivity {    private String phone;    private EventHandler eventHandler;    private Handler mHandler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(@NonNull Message message) {            int event = message.arg1;            int result = message.arg2;            Object data = message.obj;            if (result == SMSSDK.RESULT_COMPLETE) { //回调完成                //View view = MsgVerifyHelper.this.view;                switch (event) {                    case SMSSDK.EVENT_GET_VERIFICATION_CODE: {                        // 发送验证码成功                        onSendCodeSucceeded();                        break;                    }                    case SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE: {                        // 验证成功                        onVerifySucceeded();                        break;                    }                    case SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES: {                        //返回支持发送验证码的国家列表                        // 可能是号码填写错误,导致发送失败                        // 前端验证把这个给排除掉了                        onSendCodeFailed();                        break;                    }                }            }else{                //((Throwable)data).printStackTrace();                // 验证码错误                onVerifyFailed();            }            return true;        }    });    // 使用MobTech的短信推送,需要同意隐私授权。在前端界面需要强制用户同意    // 不同意不能注册    static {        MobSDK.submitPolicyGrantResult(true, null);    }    // 获取验证码    public void getCode(String phone) {        if (checkPhoneNum(phone)) {            // 请求验证码,其中country表示国家代码,如“86”;phone表示手机号码,如“13800138000”            SMSSDK.getVerificationCode("86", phone);            // 将手机号存起来            this.phone = phone;        }    }    // 验证    public void verifyCode(String code) {        if (!TextUtils.isEmpty(this.phone)) {            SMSSDK.submitVerificationCode("86", this.phone, code);        }    }    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        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;                mHandler.sendMessage(msg);            }        };        //注册一个事件回调监听,用于处理SMSSDK接口请求的结果        SMSSDK.registerEventHandler(eventHandler);    }    @Override    protected void onDestroy() {        super.onDestroy();        // 注销实践监听,防止内存泄漏        SMSSDK.unregisterEventHandler(eventHandler);    }    public String getPhone() {        return phone;    }    public void setPhone(String phone) {        this.phone = phone;    }    // 先检查手机号码是否正确。界面检查手机号时怎么给提示我不管,只需最后给我返回boolean    protected abstract boolean checkPhoneNum(String phone);    // 发送验证码成功    protected abstract void onSendCodeSucceeded();    // 发送失败(手机号不支持。一般不会发生)    protected abstract void onSendCodeFailed();    // 验证成功    protected abstract void onVerifySucceeded();    // 验证失败    protected abstract void onVerifyFailed();}

MainActivity

import android.os.Bundle;import android.text.Editable;import android.text.TextUtils;import android.text.TextWatcher;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import com.ysq.app3.util.MsgVerifyView;public class MainActivity extends MsgVerifyView {    private EditText mPhone;    private Button mGetCode; // 60s倒计时就不做了,简单测试    private EditText mCode;    private Button mVerify;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initWidgets();    }    private void initWidgets() {        mPhone = findViewById(R.id.edit_phone);        mGetCode = findViewById(R.id.btn_get_code);        mCode = findViewById(R.id.edit_code);        mVerify = findViewById(R.id.btn_verify);        mGetCode.setEnabled(false);        mPhone.addTextChangedListener(new TextWatcher() {            @Override            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {            }            @Override            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {            }            @Override            public void afterTextChanged(Editable editable) {                String content = editable.toString();                if (!TextUtils.isEmpty(content) &&                        content.matches("^1[3|4|5|7|8][0-9]\\d{4,8}$")) {                    mGetCode.setEnabled(true);                } else {                    mGetCode.setEnabled(false);                }            }        });        mGetCode.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                // 获取验证码                getCode(mPhone.getText().toString());            }        });        mVerify.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                String code = mCode.getText().toString().trim();                if (TextUtils.isEmpty(code)) {                    Toast.makeText(MainActivity.this, "请填写验证码", Toast.LENGTH_SHORT).show();                    return;                }                // 验证 验证码是否正确                verifyCode(code);            }        });    }    // 虽然已经在TextChangedListener中检验过了    // 但是防止用户不填写手机号,只填写了验证码,直接点验证按钮    @Override    protected boolean checkPhoneNum(String phone) {        if (!TextUtils.isEmpty(phone) &&                phone.matches("^1[3|4|5|7|8][0-9]\\d{4,8}$")) {            return true;        } else {            Toast.makeText(this, "请输入正确的手机号", Toast.LENGTH_SHORT).show();            return false;        }    }    @Override    protected void onSendCodeSucceeded() {        Toast.makeText(this, "已成功发送验证码", Toast.LENGTH_SHORT).show();    }    @Override    protected void onSendCodeFailed() {        Toast.makeText(this, "发送验证码失败", Toast.LENGTH_SHORT).show();    }    @Override    protected void onVerifySucceeded() {        Toast.makeText(this, "验证成功", Toast.LENGTH_SHORT).show();        // 跳转页面        FirstActivity.show(this);        finish();    }    @Override    protected void onVerifyFailed() {        Toast.makeText(this, "验证码错误", Toast.LENGTH_SHORT).show();    }}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>                    

 

更多相关文章

  1. android的日志输出和单元测试
  2. DirectionalViewPager支持横向和纵向的ViewPager
  3. android 界面着色推荐
  4. 27 Android(安卓)ActionBar
  5. android 常用权限备份
  6. RecyclerView实现聊天界面
  7. Android(安卓)高仿QQ 登陆界面
  8. Android--使用网格布局搭建简易计算器界面
  9. Android中一些很帅气的属性

随机推荐

  1. Android常用布局颜色值大全
  2. android:自定义长按/长点击事件
  3. adb shell 是什么,如何进入?
  4. android-样式和主题(style&theme)
  5. android 反编译(转)
  6. This view is not constrained verticall
  7. android ListView和GridView拖拽移位具体
  8. Android 本地广播LocalBroadcastManager
  9. Android AS平台jni环境配置
  10. Android Studio中添加Permission权限的步