实现短信验证码的功能,我这里使用的mob。
首先,我们的大环境是Android studio+eclipse+mySQL。
实现短信验证码有两种方式,一是导入相关jar包,这个之前在mob官网上就可以找到,但是更新之后官网上就没有了,所以我之前找了半天没找到,就放弃了…
第二种是使用gradle集成的方式,实现验证码的登录。这个在官网上也有介绍,好了,下面就是集成方式实现的验证码注册功能:
1、我们打开mob的官网,mob官网地址,选择开发者服务中的SMSSDK,点击开始使用:
点击右侧的创建应用,把你项目的logo和名称输入进去,选择SMSSDK就可以了。这个时候你会发现已经创建完成了。点击刚刚新建的项目,就能找到你的appKey和appSecret:
2、我们找到自己Android项目里面的bulid.gradle(这是Android下的gradle文件,不是整个项目的gradle文件)文件,在文件中添加(注意:下面的appKey和appSecret是你自己项目的!不要按照我上面的写):
apply plugin: 'com.mob.sdk'
MobSDK {
appKey "自己的appKey"
appSecret "自己的appsecret"
SMSSDK {}
}
然后配置成功后,打开项目下的bulid.gradle文件,在里面添加下面的代码:
buildscript {
repositories {
.......
}
dependencies {
...
classpath "com.mob.sdk:MobSDK:2018.0319.1724"
}
}
添加完成后,我们再打开AndroidManifest.xml文件,把相应的权限都打开:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.a7560_1525.myapplication">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /
</manifest>
ok,到现在,我们已经把环境都配置好了,现在我们来实现页面以及后台的功能:
xml文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="80dp"
android:paddingLeft="30dp">
<TextView
android:id="@+id/btn_register"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="注册"
android:textSize="30dp"
android:textColor="@color/colorAccent"
android:gravity="center"/>
<TextView
android:id="@+id/btn_login"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="登录"
android:textSize="30dp"
android:gravity="center" />
</LinearLayout>
<LinearLayout
android:layout_centerVertical="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:layout_marginTop="30dp">
<LinearLayout
android:layout_width="300dp"
android:layout_height="180dp"
android:background="@android:color/white"
android:orientation="vertical"
android:layout_gravity="center">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_marginLeft="10dp"
android:layout_width="20dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:layout_marginRight="10dp"/>
<EditText
android:id="@+id/phone"
android:layout_width="160dp"
android:layout_height="60dp"
android:background="@null"
android:hint="请输入手机号"
android:maxLength="15"
android:inputType="phone"
/>
<Button
android:id="@+id/bt_getCode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取验证码"/>
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="1dp" />
<TextView
android:id="@+id/full"
android:layout_width="50dp"
android:layout_height="15dp"
android:text=""
android:layout_marginLeft="260dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_gravity="center"
android:orientation="horizontal"
android:paddingBottom="7dp">
<ImageView
android:layout_marginLeft="10dp"
android:layout_width="20dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:layout_marginRight="10dp"/>
<EditText
android:id="@+id/code"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="@null"
android:hint="请输入验证码"
/>
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="1dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_marginLeft="10dp"
android:layout_width="20dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:layout_marginRight="10dp"/>
<EditText
android:id="@+id/user_pwd1"
android:layout_width="200dp"
android:layout_height="60dp"
android:background="@null"
android:hint="请输入密码"
android:inputType="numberPassword"
/>
<ImageView
android:id="@+id/eyes1"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="30dp"
android:layout_gravity="center" />
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/bt_vertify"
android:layout_width="300dp"
android:layout_height="50dp"
android:text="注册"
android:layout_marginTop="15dp"
android:textSize="20dp"/>
</LinearLayout>
</RelativeLayout>
Java文件:
import androidx.appcompat.app.AppCompatActivity;
import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;
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.Toast;
import com.mob.MobSDK;
import java.util.Timer;
import java.util.TimerTask;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static cn.smssdk.SMSSDK.getVerificationCode;
import static cn.smssdk.SMSSDK.submitVerificationCode;
import static com.mob.wrappers.SMSSDKWrapper.getSupportedCountries;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private final String TAG="--MainActivity--";
private TimerTask tt;
private Timer tm;
//你们自己的
private final String appKey="自己项目的aappkey";
private final String appSercret="自己项目的appsercret";
private Handler handler=new Handler(){
public void handleMessage(Message msg){
switch (msg.arg1){
case 0:
//客户端验证成功,可以进行注册,返回校验的手机和国家代码phone/country
Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();
break;
case 1:
//获取验证码成功
Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
break;
}
}
};
private Button bt_getCode;
private Button bt_vertify;
private EditText phone;
private EditText code;
private boolean isChange;
private boolean tag=true;
public String country="86";
private int i=60;
private static final int CODE_REPEAT=1;
private String sphone;
private String scode;
private EventHandler eh;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MobSDK.init(this,appKey,appSercret);
initviews();
eh=new EventHandler(){
@Override
public void afterEvent(int event, int result, Object data) {
if (result == SMSSDK.RESULT_COMPLETE) {
//回调完成
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
//提交验证码成功
Message msg = new Message();
msg.arg1 = 0;
msg.obj = data;
handler.sendMessage(msg);
Log.d(TAG, "提交验证码成功");
} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
Message msg = new Message();
//获取验证码成功
msg.arg1 = 1;
msg.obj = "获取验证码成功";
handler.sendMessage(msg);
Log.d(TAG, "获取验证码成功");
}
} else {
Message msg = new Message();
//返回支持发送验证码的国家列表
msg.arg1 = 3;
msg.obj = "验证失败";
handler.sendMessage(msg);
Log.d(TAG, "验证失败");
((Throwable) data).printStackTrace();
}
}
};
SMSSDK.registerEventHandler(eh); //注册短信回调
}
private void initviews() {
phone=findViewById(R.id.phone);
code=findViewById(R.id.code);
bt_getCode=findViewById(R.id.bt_getCode);
bt_vertify=findViewById(R.id.bt_vertify);
bt_getCode.setOnClickListener(this);
bt_vertify.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_getCode:
sphone=phone.getText().toString();
if(sphone.equals("")){
Toast.makeText(MainActivity.this,"手机号不能为空",Toast.LENGTH_SHORT).show();
}else{
//填写了手机号码
if(isMobileNO(sphone)){
//如果手机号码无误,则发送验证请求
bt_getCode.setClickable(true);
changeBtnGetCode();
getSupportedCountries();
getVerificationCode("86",sphone);
}else{
//手机号格式有误
Toast.makeText(MainActivity.this,"手机号格式错误,请检查",Toast.LENGTH_SHORT).show();
}
}
break;
case R.id.bt_vertify:
scode=code.getText().toString();
if (scode.equals("")){
Toast.makeText(MainActivity.this,"验证码不能为空",Toast.LENGTH_SHORT).show();
}else{
submitVerificationCode("86", sphone,scode);
}
break;
}
}
//当发送验证码成功时,按钮样式变成倒计时
private void changeBtnGetCode() {
Thread thread = new Thread() {
@Override
public void run() {
if (tag) {
while (i > 0) {
i--;
//如果活动为空
if (MainActivity.this == null) {
break;
}
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
bt_getCode.setText("获取验证码(" + i + ")");
bt_getCode.setClickable(false);
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
tag = false;
}
i = 60;
tag = true;
if (MainActivity.this != null) {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
bt_getCode.setText("获取验证码");
bt_getCode.setClickable(true);
}
});
}
}
};
thread.start();
}
private boolean isMobileNO(String sphone) {
String telRegex = "[1][358]\\d{9}";
if (TextUtils.isEmpty(sphone))
return false;
else
return sphone.matches(telRegex);
}
}
好了,暂时就这么多,我没有用到服务器和数据库,只是把最原始的获取验证码分享出来了,大家有需要的话可以在代码上加;