Android图形验证码工具类

移动端获取图形验证码有两种形式,一种是在本地随机生成进行验证,另一种是根据服务端返回的图片流设置到页面上,今天我们要做的就是根据服务端返回的操作图形验证码,完整demo地址:https://download.csdn.net/download/lou_liang/10421144          下面看一张图:

Android图形验证码工具类

demo中是一个底部弹出的dialog工具类,结合服务端返回的图片流显示出来。

首先自定义Dialog工具类,代码中包含点击确定按钮的接口回调部分,主要是为了根据服务器返回的图片验证码,在输入框中输入验证码,接着将输入的数字再传给服务器,以此判断是否输入验证码正确

public class PictureDialog {
    public interface  onListener{
        void OnListener(String msg);
    }
    private static onListener listeners;
    public void setListener(onListener listener){
        this.listeners = listener;
    }
    public static class Builder {
        private Context mContext;
        private Dialog mDialog;
        private ViewHolder mViewHolder;
        private View mView;
        public Builder(Context context) {
            mContext = context;
            initView();
        }
        public Builder setContent(String img){
            Glide.with(mContext).load(img).asBitmap().into(mViewHolder.ivPic);
            return this;
        }
        public Builder setPositiveButton(CharSequence sure, final View.OnClickListener listener) {
            mViewHolder.tvPositiveButton.setText(sure);

            mViewHolder.tvPositiveButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if(TextUtils.isEmpty(mViewHolder.normalMessage.getText().toString())){
                        Toast.makeText(mContext,"验证码不能为空",Toast.LENGTH_LONG).show();
                    }else {
                        mDialog.dismiss();
                        if (listener != null) {
                            listener.onClick(view);
                        }
                        if(listeners != null){
                            listeners.OnListener(mViewHolder.normalMessage.getText().toString());
                        }
                    }
                }
            });
            return this;
        }
        public Builder setNegativeButton(CharSequence text, final View.OnClickListener listener) {
            mViewHolder.tvNegativeButton.setText(text);
            mViewHolder.tvNegativeButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mDialog.dismiss();
                    if (listener != null) {
                        listener.onClick(view);
                    }
                }
            });
            return this;
        }
        
        public void show() {
            if (mDialog != null) {
                mDialog.show();
            }
        }
        public void dismiss() {
            if (mDialog != null) {
                mDialog.dismiss();
            }
        }
        private void initView() {
            mDialog = new Dialog(mContext,DialogUtils.getStyle());
            mView = LayoutInflater.from(mContext).inflate(R.layout.normal_dialog, null);
            mViewHolder = new ViewHolder(mView);
            mDialog.setContentView(mView);
            mDialog.getWindow().setGravity(Gravity.BOTTOM);
            DisplayMetrics dm = new DisplayMetrics();
            WindowManager windowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
            windowManager.getDefaultDisplay().getMetrics(dm);
            WindowManager.LayoutParams lp = mDialog.getWindow().getAttributes();
            lp.width = (int) (dm.widthPixels * 335.0 / 360.0);
            mDialog.getWindow().setAttributes(lp);
        }
        class ViewHolder {
            ImageView ivPic;
            EditText normalMessage;
            TextView tvNegativeButton;
            TextView tvPositiveButton;
            public ViewHolder(View view) {

                ivPic = (ImageView) view.findViewById(R.id.iv_pic);                   //图形验证码
                normalMessage = (EditText) view.findViewById(R.id.dialog_normal_message);//输入内容
                tvNegativeButton = (TextView) view.findViewById(R.id.dialog_negative);  //取消
                tvPositiveButton = (TextView) view.findViewById(R.id.dialog_positive);   //确定
            }
        }
    }
}

最后在MainActivity中点击加载按钮调用dialog:其中要注意filePath代表的图片流要根据大家自己服务器返回的来取,我这里是内网,其他人获取不到。

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        final PictureDialog.Builder builder1 = new PictureDialog.Builder(MainActivity.this);
        //二进制图片流根据服务端返回的来取
        String filePath ="http://192.168.6.51:36030/m/passport/register/getCaptcha.jpg?smsStoken=captcha_stoken_9e56b995c197458e9d6452851de01631";
        builder1.setContent(filePath);
        builder1.setPositiveButton( "确定", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PictureDialog pictureDialog = new PictureDialog();
                pictureDialog.setListener(new PictureDialog.onListener() {
                    @Override
                    public void OnListener( String msg) {
                        //此text为输入的验证码,提交到服务器判断输入的验证码是否正确
                        String text = msg;
                        builder1.dismiss();
                    }
                });
            }
        }).setNegativeButton("取消", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                builder1.dismiss();
            }
        }).show();
    }
});
到这里,图形验证码dialog工具类就写好了,希望对大家有帮助,谢谢。附上源码demo:https://download.csdn.net/download/lou_liang/10421144