android短信验证码功能实现,包含按钮倒计时操作

实习的时候,公司注册页面需要加上短信验证码的功能,就自己做了一个,使用的是聚合数据的短信验证SDK进行验证。

首先下载短信验证码SDK,不懂的朋友自行百度聚合数据,然后配置环境,导入相关的jar包.
这里写图片描述

2.进行mainfest的配置,加入权限

<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_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.SEND_SMS" />

并且在application节点中配置meta,key为你申请的appkey

 <meta-data
            android:name="JUHE_KEY"
            android:value="key" />

页面布局:
这里写图片描述

布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="输入手机号:"/>
    <EditText
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        android:inputType="phone"
        android:id="@+id/register_phone"/>

    <Button
        android:id="@+id/btn_register"
        android:textColor="#ffffff"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:padding="5dip"
        android:background="@drawable/bg_btn_shape_login"
        android:text="发送验证码"
        android:textSize="16sp" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="输入验证码"/>
    <EditText
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:id="@+id/register_yanzhengma"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="提交"
        android:textColor="#000000"
        android:id="@+id/btn_register_sumbit"/>

</LinearLayout>

图中的按钮为自定义样式,有需要的童鞋可以自己定义,自定义代码如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true"><shape android:shape="rectangle">
        <stroke android:width="1.0px" android:color="#ffd3dde6" />

        <corners android:bottomLeftRadius="5.0dip" android:bottomRightRadius="5.0dip" android:topLeftRadius="5.0dip" android:topRightRadius="5.0dip" />

        <gradient android:angle="270.0" android:endColor="#ff0e9379" android:startColor="#ff0e9379" />
    </shape></item>
    <item android:state_focused="true">
        <shape android:shape="rectangle">
        <gradient android:angle="270.0" android:endColor="#ff0e9379" android:startColor="#ff0e9379" />

        <stroke android:width="1.0px" android:color="#ffd3dde6" />

        <corners android:bottomLeftRadius="5.0dip" android:bottomRightRadius="5.0dip" android:topLeftRadius="5.0dip" android:topRightRadius="5.0dip" />
    </shape></item>

    <item>
        <shape android:shape="rectangle">
            <gradient android:angle="270.0" android:endColor="#2B86E3" android:startColor="#2B86E3" />

            <stroke android:width="1.0px" android:color="#ffd3dde6" />

            <corners android:bottomLeftRadius="5.0dip" android:bottomRightRadius="5.0dip" android:topLeftRadius="5.0dip" android:topRightRadius="5.0dip" />
        </shape>

    </item>

</selector>

在说主方法之前,想说一点,就是我们经常看到在点击获得验证码时候按钮进行倒计时操作,当然,你可以自定义Button来写,也可以使用Handler来写,我使用的是TimeCount这个android提供的类进行的:

class  TimeCount extends CountDownTimer{

        public TimeCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        //计时过程显示
        @Override
        public void onTick(long millisUntilFinished) {
            button.setTextSize(14);
            button.setText(millisUntilFinished / 1000 + "秒后重新发送");
            button.setClickable(false);
            button.setBackgroundDrawable(getDrawable(R.drawable.bg_btn_shape_sending));
        }
        //计时完成触发
        @Override
        public void onFinish() {
            button.setText("获取验证码");
            button.setBackgroundDrawable(getDrawable(R.drawable.bg_btn_shape_login));
            button.setClickable(true);
        }
    }

代码很简单,自己看也能看懂,这里就不多叙述了,不懂的童鞋自行百度。

Activity代码:


/**
 * Created by Chan on 2015/8/8 0008.
 */
public class RegisterActivity extends Activity implements View.OnClickListener {
    private Button button;
    private EditText phoneNum,getNum;
    private SMSCaptcha smsCaptcha;
    private String phone;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_register);
        //获得验证码实例
        smsCaptcha=SMSCaptcha.getInstance();
        button = (Button) findViewById(R.id.btn_register);
        phoneNum = (EditText) findViewById(R.id.register_phone);
        getNum= (EditText) findViewById(R.id.register_yanzhengma);
        button.setOnClickListener(this);
        findViewById(R.id.btn_register_sumbit).setOnClickListener(this);
    }


    //验证码按钮计时器
    private TimeCount time;

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            //简单判断手机号码格式
            case R.id.btn_register:
                    if (TextUtils.isEmpty(phoneNum.getText()))
                    {
                        Toast.makeText(RegisterActivity.this,"请输入手机号",Toast.LENGTH_SHORT).show();
                        phoneNum.getText().clear();
                    }
                    else if (phoneNum.getText().toString().length()!=11)
                    {
                        Log.e("phoneNum.getText()",phoneNum.getText().toString().length()+"");
                        phoneNum.getText().clear();
                        Toast.makeText(RegisterActivity.this,"输入有误,请重新输入",Toast.LENGTH_SHORT).show();
                    }
                    else
                    {
                        //进行验证
                        time=new TimeCount(60000,1000);//参数依次为总时长,计时时间间隔
                        time.start();
                        phone=phoneNum.getText().toString();
                        //此方法用来向服务器发送请求验证码的请求,参数依次为你的电话,以及回调结果
                        smsCaptcha.sendCaptcha(phone, new BaseData.ResultCallBack() {
                            @Override
                            public void onResult(int i, String reason, String result) {
                                if (i!=0){
                                    Toast.makeText(RegisterActivity.this,reason,Toast.LENGTH_SHORT).show();
                                }
                            }
                        });
                    }
                break;
            case R.id.btn_register_sumbit:
                final ProgressDialog progressDialog=ProgressDialog.show(RegisterActivity.this,"请稍候","正在验证....");
                String result=getNum.getText().toString().trim();
                //提交验证码
                smsCaptcha.commitCaptcha(phone, result, new BaseData.ResultCallBack() {
                    @Override
                    public void onResult(int code, String reason, String result)
                    {
                        if (code==0)
                        {
                            progressDialog.dismiss();
                            Intent intent=new Intent(RegisterActivity.this,UserRegsiterActivtity.class);
                            startActivity(intent);
                        }
                        else
                        {
                            progressDialog.dismiss();
                            Toast.makeText(RegisterActivity.this, "验证码错误", Toast.LENGTH_SHORT).show();

                            return;
                        }
                    }
                });
                break;

        }
    }

    class  TimeCount extends CountDownTimer{

        public TimeCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        //计时过程显示
        @Override
        public void onTick(long millisUntilFinished) {
            button.setTextSize(14);
            button.setText(millisUntilFinished / 1000 + "秒后重新发送");
            button.setClickable(false);
            button.setBackgroundDrawable(getDrawable(R.drawable.bg_btn_shape_sending));
        }
        //计时完成触发
        @Override
        public void onFinish() {
            button.setText("获取验证码");
            button.setBackgroundDrawable(getDrawable(R.drawable.bg_btn_shape_login));
            button.setClickable(true);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (time!=null)
        {
            time.cancel();
            time=null;
        }
    }
}

主要的方法就是两个

发送获取验证码请求

smsCaptcha.sendCaptcha(phone, new BaseData.ResultCallBack() {
                            @Override
                            public void onResult(int i, String reason, String result) {
                                if (i!=0){
                                    Toast.makeText(RegisterActivity.this,reason,Toast.LENGTH_SHORT).show();
                                }
                            }
                        });

以及验证验证码正确与否请求

 smsCaptcha.commitCaptcha(phone, result, new BaseData.ResultCallBack() {
                    @Override
                    public void onResult(int code, String reason, String result)
                    {
                        if (code==0)
                        {
                            progressDialog.dismiss();
                            Intent intent=new Intent(RegisterActivity.this,UserRegsiterActivtity.class);
                            startActivity(intent);
                        }
                        else
                        {
                            progressDialog.dismiss();
                            Toast.makeText(RegisterActivity.this, "验证码错误", Toast.LENGTH_SHORT).show();

                            return;
                        }
                    }
                });

聚合数据有提供官方开发的api文档以及demo,不懂的童鞋可以自行查阅,写的很清楚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值