Android利用mob实现短信验证登录

article/2025/9/15 16:17:55

首先要去官网申请一个应用,拿到对应的APPKEY以及APPSECRET
附上直通车链接MobTech
申请应用基本是秒批,然后就可以得到应用的APPKEY以及APPSECRET
然后就是查看官方的文档
直接跟着步骤走,可以不用手动下载sdk,导入这些它自动会帮你下载
在这里插入图片描述
这里的话appkey和appSecret要更换成你刚刚申请应用对应的appkey和appSecret
在这里插入图片描述

创建一个Applicaion来初始化MobSDK。
别忘可在AndroidMainfest上注册

    @Overridepublic void onCreate() {super.onCreate();//初始化MobSDK.init(this);}

SMSSDK已经做了混淆处理,再次混淆会导致不可预期的错误,请在您的混淆脚本中添加如下的配置,跳过对SMSSDK的混淆操作,在proguard-rules.pro文件最底部加上这几行代码

-keep class com.mob.**{*;}
-keep class cn.smssdk.**{*;}
-dontwarn com.mob.**

这个是权限

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITEAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

在application标签中添加如下activity标签


<activity
android:name="com.mob.tools.MobUIShell"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="stateHidden|adjustResize"/>

布局的话我写的很简单,我就不贴出来了,两个输入框,两个按钮
在这里插入图片描述
接下来就是MainActivity的函数了

package com.example.read_app.Activity;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;import android.Manifest;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import com.example.read_app.Constant.WX_Constant;
import com.example.read_app.R;
import com.mob.MobSDK;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;import org.json.JSONException;
import org.json.JSONObject;import java.io.IOException;import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;public class LoginActivity extends AppCompatActivity implements View.OnClickListener {public static final String TAG = "LoginActivity";String APPKEY = "xxxxxxxx";String APPSECRET = "xxxxxxxx";private ImageView imageView;private EditText et_phoneNum, et_password;private Button btn_login, btn_getMsg;private int i = 30;//计时器@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);//如果 targetSdkVersion小于或等于22,可以忽略这一步,如果大于或等于23,需要做权限的动态申请:if (Build.VERSION.SDK_INT >= 23) {String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CALL_PHONE, Manifest.permission.READ_LOGS, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.SET_DEBUG_APP, Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.GET_ACCOUNTS, Manifest.permission.WRITE_APN_SETTINGS};ActivityCompat.requestPermissions(this, mPermissionList, 123);}//onCreate里注册initView();// 启动短信验证sdkMobSDK.init(this, APPKEY, APPSECRET);EventHandler eventHandler = new EventHandler() {@Overridepublic void afterEvent(int i, int i1, Object o) {Message message = new Message();message.arg1 = i;message.arg2 = i1;message.obj = o;handler.sendMessage(message);}//注册回调监听接口};SMSSDK.registerEventHandler(eventHandler);}private void initView() {et_phoneNum = findViewById(R.id.et_phoneNum);et_password = findViewById(R.id.user_password);btn_getMsg = findViewById(R.id.btn_getMsg);btn_login = findViewById(R.id.btn_login);imageView = findViewById(R.id.wechat_login);btn_login.setOnClickListener(this);btn_getMsg.setOnClickListener(this);}Handler handler = new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {if (msg.what == -9) {btn_getMsg.setText("重新发送(" + i + ")");} else if (msg.what == -8) {btn_getMsg.setText("获取验证码");btn_getMsg.setClickable(true);i = 30;} else {int i = msg.arg1;int i1 = msg.arg2;Object o = msg.obj;if (i1 == SMSSDK.RESULT_COMPLETE) {// 短信注册成功后,返回MainActivity,然后提示if (i == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {Toast.makeText(LoginActivity.this, "提交验证码成功", Toast.LENGTH_SHORT).show();Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);Bundle bundle = new Bundle();bundle.putString("userName", et_phoneNum.getText().toString().trim());intent.putExtras(bundle);startActivity(intent);} else if (i == SMSSDK.EVENT_GET_VOICE_VERIFICATION_CODE) {Toast.makeText(LoginActivity.this, "正在获取验证码", Toast.LENGTH_SHORT).show();} }}}};@Overridepublic void onClick(View view) {String phoneNum = et_phoneNum.getText().toString();switch (view.getId()){case R.id.btn_getMsg:// 1. 判断手机号是不是11位并且看格式是否合理if (!judgePhoneNums(phoneNum)){return;}// 2. 通过sdk发送短信验证SMSSDK.getVerificationCode("86",phoneNum);// 3. 把按钮变成不可点击,并且显示倒计时(正在获取)btn_getMsg.setClickable(false);btn_getMsg.setText("重新发送(" + i + ")");new Thread(new Runnable() {@Overridepublic void run() {for ( ; i  > 0; i--) {handler.sendEmptyMessage(-9);if (i <= 0 ){break;}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}handler.sendEmptyMessage(-8);}}).start();break;case R.id.btn_login:if (et_phoneNum == null){Toast.makeText(LoginActivity.this,"手机号不能为空",Toast.LENGTH_SHORT).show();Log.d(TAG, "onClick: 手机号不能为空");}if (et_password == null){Toast.makeText(LoginActivity.this,"验证码不能为空",Toast.LENGTH_SHORT).show();}//将收到的验证码和手机号提交再次核对SMSSDK.submitVerificationCode("86", phoneNum, et_password.getText().toString());break;}}/*** 判断手机号码是否合理** @param phoneNums*/private boolean judgePhoneNums(String phoneNums) {if (isMatchLength(phoneNums, 11)&& isMobileNO(phoneNums)) {return true;}Toast.makeText(this, "手机号码输入有误!", Toast.LENGTH_SHORT).show();return false;}/*** 判断一个字符串的位数** @param str* @param length* @return*/public static boolean isMatchLength(String str, int length) {if (str.isEmpty()) {return false;} else {return str.length() == length ? true : false;}}/*** 验证手机格式*/public static boolean isMobileNO(String mobileNums) {/** 移动:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188* 联通:130、131、132、152、155、156、185、186 电信:133、153、180、189、(1349卫通)* 总结起来就是第一位必定为1,第二位必定为3或5或8,其他位置的可以为0-9*/String telRegex = "[1][358]\\d{9}";// "[1]"代表第1位为数字1,"[358]"代表第二位可以为3、5、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。if (TextUtils.isEmpty(mobileNums))return false;elsereturn mobileNums.matches(telRegex);}@Overrideprotected void onDestroy() {//反注册回调监听接口SMSSDK.unregisterAllEventHandler();super.onDestroy();}}

因为这是一个免费的SMS短信验证接口,收到短信的速度会比付费的慢一些,比较适合个人开发使用
附上效果图
在这里插入图片描述


http://chatgpt.dhexx.cn/article/7QPTu4pU.shtml

相关文章

微信小程序短信验证登录

首先小程序wxml页面 <!--pages/logins/logins.wxml--> <view class"container"><view class"title">登录</view><form catchsubmit"login"><view class"inputView"><input class"inputT…

Springboot实现短信验证登录

一、介绍 使用短信验证登录也是现在实际项目中普遍使用的一种登录, 二、实际的操作流程 1.用户在前端页面输入手机号码之后,点击发送验证码 2.前端将手机号传给后端 3.后端生成一个6为的随机数通过短信发送给用户,之后将手机号设为key,验证码设为value存入redis缓存中…

html短信验证登录

最近在做项目中遇到了一个问题&#xff0c;做的是一个后台管理。都知道&#xff0c;后台是需要一定安全性的&#xff0c;所以一定要有登录这个功能的。然而登录这个功能&#xff0c;又有一个不可或缺的因素&#xff0c;那就是验证登录。不论是图形验证也好&#xff0c;还是什么…

spring security——短信验证码登录(四)

一、导读 短信登录和用户名密码登录的逻辑是不同的&#xff0c;Spring Security 框架中实现的是用户名密码的登录方式。现在我们就模仿它的原理来加入短信登录的认证&#xff08;注意不是验证&#xff09;&#xff0c;实现右边的。 之前写的图形验证码是在 UsernamePasswordAut…

雅克比矩阵求导推导

首先&#xff0c;引入雅克比矩阵公式&#xff1a; J [ u 1 u 2 ⋯ u n e 1 e 2 ⋯ e n ] \mathbf{J}\left[\begin{array}{c} \begin{array}{lll}\mathbf{u}_{1} & \mathbf{u}_{2} & \cdots & \mathbf{u}_{n}\end{array} \\ \begin{array}{lll}\mathbf{e}_{1} &…

矩阵求导公式

转自&#xff1a;http://blog.sina.com.cn/s/blog_4a033b090100pwjq.html 求导公式(撇号为转置&#xff09;&#xff1a; Y A * X --> DY/DX A Y X * A --> DY/DX A Y A * X * B --> DY/DX A * B Y A * X * B --> DY/DX B * A 乘积的导数 d(f*g)/dx(df/dx)…

矩阵求导法则的总结

最重要的写在前面&#xff1a; 进行更新&#xff1a;随着理解的加深&#xff0c;我发现之前写的有些问题&#xff0c;重新写一下吧 矩阵求导要分成两类&#xff0c;第一类是用在向量函数f(x)里&#xff0c;比如要在x0处展开&#xff0c;所以需要计算该点处的雅可比这些&#…

-矩阵求导-

一、为什么需要矩阵求导 参数的向量化&#xff1a; 向量化会使代码、式子更加简洁&#xff1b; 使用向量化代替for循环&#xff0c;向量化能够加速你的代码&#xff1b;求导在优化算法中的广泛应用&#xff1a; 优化算法需要反向传播&#xff0c;需要对参数矩阵进行求导 二、…

矩阵求导简析

大家好&#xff0c;这是我的第一篇博客。 矩阵求导&#xff08;Matrix Derivation&#xff0c;或者Matrix Differential&#xff09;&#xff0c;在机器学习、图像处理、最优化领域经常会遇到。其本质是多元变量的微积分&#xff0c;只是把求导应用在了矩阵上&#xff0c;不同在…

矩阵求导法则

转载自&#xff1a;https://blog.csdn.net/dinkwad/article/details/72819832 矩阵求导的技术&#xff0c;在统计学、控制论、机器学习等领域有广泛的应用。鉴于我看过的一些资料或言之不详、或繁乱无绪&#xff0c;本文来做个科普&#xff0c;分作两篇&#xff0c;上篇讲标量…

矩阵求导总结

文章目录 1.分子为标量1.1 ∂ 标量 ∂ 标量 \frac{\partial 标量}{\partial标量} ∂标量∂标量​1.2 ∂ 标量 ∂ 向量 \frac{\partial 标量}{\partial向量} ∂向量∂标量​1.3 ∂ 标量 ∂ 矩阵 \frac{\partial 标量}{\partial矩阵} ∂矩阵∂标量​ 2.分子为向量2.1 ∂ 向量…

矩阵求导方法

矩阵求导方法 在机器学习过程中&#xff0c;我们经常会对矩阵进行相关的操作&#xff0c;现对矩阵求导方法进行概况与推导。 首先总结矩阵求导的本质&#xff0c;即矩阵A中每个元素对矩阵B中每个元素求导。我们先从宏观上理解这个公式&#xff0c;即从求导后元素的个数来理解…

矩阵求导

一、矩阵和向量求导 参考地址&#xff1a;https://cloud.tencent.com/developer/article/1668818 求导公式大全&#xff1a;https://cloud.tencent.com/developer/article/1551901 机器学习中最常用的矩阵求导有&#xff1a;标量对矩阵的求导&#xff0c;矩阵对标量求导以…

矩阵求导、几种重要的矩阵及常用的矩阵求导公式

一、矩阵求导 一般来讲&#xff0c;我们约定x(x1,x2,...xN)Tx(x1,x2,...xN)T&#xff0c;这是分母布局。常见的矩阵求导方式有&#xff1a;向量对向量求导&#xff0c;标量对向量求导&#xff0c;向量对标量求导。 1、向量对向量求导 2、标量对向量求导 3、向量对标量求导 其他…

矩阵求导(本质、原理与推导)详解

矩阵求导是机器学习与深度学习的基础&#xff0c;它是高等数学、线性代数知识的综合&#xff0c;并推动了概率论与数理统计向多元统计的发展。在一般的线性代数的课程中&#xff0c;很少会提到矩阵导数的概念&#xff1b;而且在网上寻找矩阵求导的知识点&#xff0c;也是五花八…

矩阵求导常用公式

矩阵求导常用公式 1 引言2 向量的导数2.1 向量对标量求导 Vector-by-scalar2.2 标量对向量求导 Scalar-by-vector2.3 向量对向量求导 Vector-by-vector 3 矩阵的导数3.1 矩阵对标量求导 Matrix-by-scalar3.2 标量对矩阵求导 Scalar-by-matrix 4 常用求导公式4.1 向量对向量求导…

矩阵的求导

目录 1 布局(Layout) 1.1 矩阵向量求导引入 1.2 矩阵向量求导定义 1.3 矩阵向量求导布局 1.4 分母布局的另一种求解方法 1.5 总结 2 基本的求导规则 2.1 向量对标量求导&#xff08;相对于数量变量的微分&#xff0c;即自变量是数量变量&#xff09; 2.1.1 定义 2.1.…

JAVA—IO流详解

1. 流概述 1.1. 什么是IO IO:Input/Output即输入&输出&#xff0c;也称之为流&#xff08;河流&#xff0c;水流&#xff09;&#xff0c;指的是数据从一个地点到另一个地点过程&#xff1b;对于计算机来说文件的拷贝过程&#xff0c;文件的编写保存&#xff0c;显示功能…

Java高级特性-IO流

文章目录 前言一、什么是IO流二、字节流-输入输出三、字符流 - 输入输出四、复制文件五、总结 前言 在Java开发中我们经常会涉及到文件方面的操作&#xff0c;不论是网站的上传文件&#xff0c;还是服务器提供给客户端下载文件&#xff0c;这些都需要我们来处理&#xff0c;那J…

java IO流之BufferedReader和BufferedWriter

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;笑霸final的主页 &#x1f4d5;系列专栏&#xff1a;&#xff1a;本文写在java专栏 &#x1f4e7;如果文章知识点有错误的地方&#…