MOB之SMS短信验证

短信验证是绝大多数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);
    }
}




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值