前言

作业需要用到:短信验证码推送(用于注册)。了解到一个免费的手机短信推送平台,就去官网看了看相关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() {@Overridepublic 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);}}@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);eventHandler=new EventHandler(){@Overridepublic 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);}@Overrideprotected void onDestroy() {super.onDestroy();// 注销实践监听,防止内存泄漏SMSSDK.unregisterEventHandler(eventHandler);}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}// 先检查手机号码是否正确。界面检查手机号时怎么给提示我不管,只需最后给我返回booleanprotected 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;@Overrideprotected 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() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Overridepublic void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Overridepublic 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() {@Overridepublic void onClick(View view) {// 获取验证码getCode(mPhone.getText().toString());}});mVerify.setOnClickListener(new View.OnClickListener() {@Overridepublic 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中检验过了// 但是防止用户不填写手机号,只填写了验证码,直接点验证按钮@Overrideprotected 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;}}@Overrideprotected void onSendCodeSucceeded() {Toast.makeText(this, "已成功发送验证码", Toast.LENGTH_SHORT).show();}@Overrideprotected void onSendCodeFailed() {Toast.makeText(this, "发送验证码失败", Toast.LENGTH_SHORT).show();}@Overrideprotected void onVerifySucceeded() {Toast.makeText(this, "验证成功", Toast.LENGTH_SHORT).show();// 跳转页面FirstActivity.show(this);finish();}@Overrideprotected void onVerifyFailed() {Toast.makeText(this, "验证码错误", Toast.LENGTH_SHORT).show();}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="12dp"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/edit_phone"android:layout_width="0dp"android:layout_height="wrap_content"android:hint="手机号"android:inputType="phone"android:layout_weight="1"/><Buttonandroid:id="@+id/btn_get_code"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="获取验证码"/></LinearLayout><EditTextandroid:id="@+id/edit_code"android:hint="验证码"android:layout_width="match_parent"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/btn_verify"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="验证" /></LinearLayout>

【免费的短信推送API】【MobTech】【Android】手机短信验证码推送相关推荐

  1. android 通过短信找回密码,我的android手机短信被我加密了,忘记密码了,在不刷机恢复出厂设置的情况下如何解决?急急急!!!!!...

    如果能进入recovery,就刷机:不能就百度"救砖". 进入Recovery模式方法: 方法一:如果手机是开机状态,请先关机,抠下电池再装上,在关机情况下,同时按住电源键 + 小 ...

  2. JavaScript 通过plus读取android手机短信内容

    JavaScript 通过plus读取android手机短信内容. 1.获取android权限 在HBuilder工程中双击应用的"manifest.json"文件,切换到&quo ...

  3. 短信开发系列(二):GSM手机短信开发之短信解码

    短信开发系列目录: 短信开发系列(一):GSM手机短信开发初探 短信开发系列(二):GSM手机短信开发之短信解码 短信开发系列(三):短信接收引擎 昨天写了短信的发送,今天我们在来谈谈如果读取SIM卡 ...

  4. android 手机短信恢复,安卓手机短信删除了怎么恢复?简单恢复的方法

    原标题:安卓手机短信删除了怎么恢复?简单恢复的方法 安卓手机短信删除了怎么恢复?手机短信是生活中不经常使用到,但是依然是十分重要的存在,因为我们现在比较喜欢用社交软件与别人进行交流,但是在一些相对重要 ...

  5. 华为设置android系统提醒功能,华为手机短信不提醒怎么办?华为手机短信提醒设置方法...

    华为手机短信提醒设置方法 1)检查当前设置的默认短信应用是哪个应用. ①点击桌面"设置"图标②找到"应用程序管理" ③选择"默认应用设置"④ ...

  6. android iphone6 同步短信,如何将Android手机短信备份到iPhone6

    最新文章: Virson的博客 文章来自: Lattice 很之前都问过这个问题,我应该如何将Android短信备份到Apple iPhone6?实际上,我之前曾使用过各种软件进行测试,发现如果没有越 ...

  7. android 短信转发设置权限,用Tasker实现Android手机短信转发到钉钉

    ​ 之前的一篇文章[<用Tasker实现Android手机短信转发到微信>](https://taskerm.com/2018/12/22/forwarded-sms-to-wechat. ...

  8. iPhone苹果手机短信如何批量删除苹果iPhone手机短信?

    iPhone苹果手机短信如何批量删除苹果iPhone手机短信? 1.iPhone苹果手机短信较多,如何才能快捷的批量删除苹果iPhone手机短信. 2.打开苹果iPhone手机设置: 3.在iPhon ...

  9. android手机短信删除了怎么恢复,手机短信不小心删了怎么办 手机已删除短信恢复步骤介绍【教程】...

    手机短信不小心删了怎么恢复?已删除的短信怎么恢复?随着微信.QQ等聊天软件使用的人越来越多,我们现在已经很少使用手机短信聊天了,但是我们还是需要利用手机短信功能接收一些重要的信息,如果我们在使用手机短 ...

  10. android手机短信利器

    自己开发的android手机短信利器来了,第一次献给机锋了 2013-2-7 21:52 上传 下载附件 (80.45 KB) 聚讯通是一款运行在手机安卓系统上的短信邮件增强工具,可以方便的进行短信. ...

最新文章

  1. [原创]软件测试思维方式
  2. python代码壁纸-一个爬取壁纸的python代码
  3. 数据层HikariCP与MyBatis整合
  4. 在 WASI 上运行 .NET 7 应用程序
  5. php mysql 取最小值_php – 根据另一个值更新最小值 – MySql
  6. LeetCode 2202. K 次操作后最大化顶端元素
  7. ctf的php,CTF中常见的PHP漏洞
  8. 在PropertyGrid中使用密码显示
  9. Java Maven项目打包成可执行jar文件
  10. Python爬虫安居客房价信息(并利用百度地图API查询坐标)
  11. 完全自定义TabBar(八)
  12. go并发编程实战 第二版 pdf_完美!啃透P9大佬这份完整版的《并发编程宝典》,成为Offer收割机...
  13. 爱创课堂每日一题第四十八天- html5有哪些新特性、移除了那些元素?
  14. git tag 使用方法(打标签、发布及回滚)
  15. Lua中的聊天屏蔽敏感词汇
  16. 微电子专业要学c语言吗,微电子不是人能学的!
  17. Android Studio4.2.2出现fastutil下载失败导致无法同步的问题
  18. docker运行jenkins挂掉_使用Jenkins在Kubernetes上设置CI/CD管道
  19. PostgreSql增删改(与mysql差异)
  20. Linux tar压缩和解压

热门文章

  1. ElasticSearch教程——cardinality(去重)算法之优化内存开销以及HLL算法
  2. Java项目:基于SSM的在线考试系统
  3. 《Redis开发与运维》---- 集合Set
  4. v48.05 鸿蒙内核源码分析(信号生产) | 年过半百 活力十足 | 百篇博客分析HarmonyOS源码
  5. 如何找到win10的锁屏推送壁纸
  6. ZYNQ_PS读写PL资源
  7. wiki中文数据语料抽取-gensim构建word2vec模型
  8. 工作展望简短_学生会简短工作展望
  9. 【码云周刊第 30 期】打造场景化的图片特效处理工具
  10. (进程管理2 搞死进程)