首先要去官网申请一个应用,拿到对应的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短信验证接口,收到短信的速度会比付费的慢一些,比较适合个人开发使用
附上效果图