短信验证是绝大多数App都会又的功能 这里写了一个帮助类 简单化短信验证
代码里面对获取验证 提交登陆的操作:
废话不多说直接上代码:
首先导入Mob的 jar包
在Build.gradle文件里
repositories {
flatDir {
dirs 'libs' // 就是你放aar的目录地址
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
// 短信验证
compile name: 'SMSSDK-2.1.3', ext: 'aar'
}
之后再清单文件 AndroidManifest.xml 里写入
<activity
android:name="com.mob.tools.MobUIShell"
android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="stateHidden|adjustResize"/>
最后就是带上 SMSUtil 进行开发了
* 注意:里面有两个方法是可以放到其他工具类里的 < 正则、判断网络是否可用 >
/**
* 作者: CoolTone
* 描述: 短信帮助类
*/
public class SMSUtil extends Activity {
// 此APPKEY仅供测试使用,且不定期失效,请到mob.com后台申请正式APPKEY
private static String APP_KEY = "1c078b38*****";
// 填写从短信SDK应用后台注册得到的APPSECRET
private static String APP_SECRET = "6ce6ac2a6dddd8dcead070**********";
private final Context mContext;
private static SMSUtil sms = null; // 单例
private boolean flag = true;
private TextView mGetCord; // 获取验证码
private EditText mPhone; // 手机号
private EditText mCord; // 验证码
private String sPhone; // 手机号
private String sCord; // 验证码
public static SMSUtil newInstance(Context context) {
if (sms == null) {
sms = new SMSUtil(context);
}
return sms;
}
private SMSUtil(Context context) {
mContext = context;
initSDK(handler);
}
public SMSUtil setCondition(EditText phone, EditText cord, TextView getCord) {
mPhone = phone;
mCord = cord;
mGetCord = getCord;
return sms;
}
private onSmsSucceedListener mOnSmsSucceedListener;
public interface onSmsSucceedListener {
void onSucceedListener(boolean isSucceed);
}
public void setOnSmsSucceedListener(onSmsSucceedListener listener) {
mOnSmsSucceedListener = listener;
}
private void setSucceed(boolean Succeed) {
if (mOnSmsSucceedListener != null) {
mOnSmsSucceedListener.onSucceedListener(Succeed);
}
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 2:
setSucceed(true);
break;
case 5:
Toast.makeText(mContext, "获取验证码失败", Toast.LENGTH_SHORT).show();
break;
case 6:
Toast.makeText(mContext, "验证失败", Toast.LENGTH_SHORT).show();
break;
}
}
};
// 初始化SMS SDK
public SMSUtil initSDK(final Handler handler) {
SMSSDK.initSDK(mContext, APP_KEY, APP_SECRET);
EventHandler 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)
handler.sendEmptyMessage(2);
// // 获取验证码成功
// if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE)
// // 返回支持发送验证码的国家列表
// if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES)
} else {
if (flag) {
handler.sendEmptyMessage(5);
} else {
handler.sendEmptyMessage(6);
((Throwable) data).printStackTrace();
}
}
}
};
SMSSDK.registerEventHandler(eh);
return sms;
}
/**
* 获取验证码
*
* @return
*/
public SMSUtil getCord() {
if (isNetAvailable(mContext)) { // 判断网络
sPhone = mPhone.getText().toString().trim();
if (isMobile(sPhone)) { // 判断手机号
timeRemain(60l, mGetCord);
SMSSDK.getVerificationCode("86", sPhone);
mCord.requestFocus();
} else {
Toast.makeText(mContext, "手机号格式不正确", Toast.LENGTH_LONG).show();
mPhone.requestFocus();
}
} else
Toast.makeText(mContext, "当前网络不可用请检查网络!", Toast.LENGTH_SHORT).show();
return sms;
}
/**
* 获取手机登陆
*
* @return
*/
public SMSUtil submitPhone() {
sPhone = mPhone.getText().toString().trim();
sCord = mCord.getText().toString().trim();
if (isNetAvailable(mContext)) {
if (sCord.length() == 4) {
SMSSDK.submitVerificationCode("86", sPhone, sCord);
flag = false;
} else {
Toast.makeText(mContext, "验证码错误", Toast.LENGTH_SHORT).show();
mCord.requestFocus();
}
} else
Toast.makeText(mContext, "当前网络不可用请检查网络!", Toast.LENGTH_SHORT).show();
return sms;
}
/**
* 检查当前网络是可用
*/
private boolean isNetAvailable(Context context) {
// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService
(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null) {
return false;
} else {
NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();
if (networkInfo != null && networkInfo.length > 0) {
for (int i = 0; i < networkInfo.length; i++) {
// 判断当前网络状态是否为连接状态
if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
}
return false;
}
public static CountDownTimer getCode_CD_timer;// 获取验证码计时器
public static long timeRemain;// 时间剩余记录
/**
* @param arg0 时间
* 获取验证码时间计时器初始化
*/
public void timeRemain(Long arg0, final TextView getCord) {
SMSUtil.getCode_CD_timer = new CountDownTimer(arg0 * 1000, 1000) {
@Override
public void onTick(long arg0) {
getCord.setClickable(false);
getCord.setText("重新获取" + "(" + arg0 / 1000 + ")"); // 每隔1秒显示时间剩余
SMSUtil.timeRemain = arg0 / 1000; // 保存剩余时间
if (arg0 <= 0) {
SMSUtil.timeRemain = 60l; // 计时完成剩余时间记录重置60s
}
}
@Override
public void onFinish() {
getCord.setText("获取验证码");
getCord.setClickable(true); // 60秒结束后按钮可点击
}
}.start();
}
/**
* 验证手机格式
*/
private boolean isMobile(String number) {
/*
移动: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
*/
//"[1]"代表第1位为数字1,"[358]"代表第二位可以为3、5、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。
String num = "[1][34578]\\d{9}";
//matches():字符串是否在给定的正则表达式匹配
return !TextUtils.isEmpty(number) && number.matches(num);
}
}
下面是 功能测试:
登陆页面的Xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff">
<LinearLayout
android:id="@+id/ll_sms_layout1"
android:layout_width="match_parent"
android:layout_height="52dp"
android:layout_marginTop="100dp"
android:background="#dedede">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:padding="10dp"
android:text="电话"/>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:background="#141414"/>
<EditText
android:id="@+id/et_sms_phone"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@null"
android:hint="手机号"
android:inputType="number"
android:maxLength="11"
android:maxLines="1"
android:padding="4dp"
android:textColor="#000"
android:textColorHint="#a6a6a6"
android:textCursorDrawable="@null"
android:textSize="14sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="52dp"
android:layout_below="@id/ll_sms_layout1"
android:layout_marginTop="20dp"
android:background="#dedede">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:padding="10dp"
android:text="验证码"/>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:background="#141414"/>
<EditText
android:id="@+id/et_sms_cord"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@null"
android:hint="验证码"
android:inputType="number"
android:maxLength="4"
android:maxLines="1"
android:padding="4dp"
android:textColor="#000"
android:textColorHint="#a6a6a6"
android:textCursorDrawable="@null"
android:textSize="14sp"/>
<TextView
android:id="@+id/tv_sms_getCord"
android:layout_width="110dp"
android:layout_height="40dp"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:text="获取验证码"
android:textColor="#141414"/>
</LinearLayout>
<TextView
android:id="@+id/tv_sms_submit"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="100dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="#dedede"
android:gravity="center"
android:text="登陆"/>
</RelativeLayout>
代码里面对获取验证 提交登陆的操作:
* 注意:不管放到哪里一定是要 先有控件 在初始化SMSUtils 并且在点击获取之前 否则会报错这里我放在了initView()里。
private void initView() {
mSubmit = ((TextView) findViewById(R.id.tv_sms_submit));
mPhone = ((EditText) findViewById(R.id.et_sms_phone));
mCord = ((EditText) findViewById(R.id.et_sms_cord));
mGetCord = ((TextView) findViewById(R.id.tv_sms_getCord));
//短信
mSmsUtil = SMSUtil.newInstance(this).setCondition(mPhone, mCord, mGetCord);
}
/**
* 作者: CoolTone
* 描述: 短信验证登陆页面
*/
public class MainActivity extends BaseActivity implements View.OnClickListener, SMSUtil.onSmsSucceedListener {
private TextView mSubmit; // 提交
private EditText mPhone; // 手机号
private EditText mCord; // 验证码
private TextView mGetCord; // 获取验证码
private SMSUtil mSmsUtil;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setListener();
}
private void setListener() {
mGetCord.setOnClickListener(this);
mSubmit.setOnClickListener(this);
mSmsUtil.setOnSmsSucceedListener(this);
}
private void initView() {
mSubmit = ((TextView) findViewById(R.id.tv_sms_submit));
mPhone = ((EditText) findViewById(R.id.et_sms_phone));
mCord = ((EditText) findViewById(R.id.et_sms_cord));
mGetCord = ((TextView) findViewById(R.id.tv_sms_getCord));
//短信
mSmsUtil = SMSUtil.newInstance(this).setCondition(mPhone, mCord, mGetCord);
}
@Override
public void onClick(View v) {
if (v != null) {
switch (v.getId()) {
case R.id.tv_sms_getCord:
mSmsUtil.getCord();
break;
case R.id.tv_sms_submit:
mSmsUtil.submitPhone();
break;
}
}
}
@Override
public void onSucceedListener(boolean isSucceed) {
Log.e("MainActivity", "执行登陆请求或者其他操作:" + isSucceed);
}
}