手机端产生本地图形验证码
手机 本地 图形 验证码 产生
2023-09-14 09:00:23 时间
生成图形验证码校验类
package com.chao.createcode; import java.util.Random; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Bitmap.Config; public class Code { private static final char[] CHARS = { 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, g, h, j, k, m, n, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, P, Q, R, S, T, U, V, W, X, Y, Z }; private static Code bmpCode; public static Code getInstance() { if(bmpCode == null) bmpCode = new Code(); return bmpCode; } //default settings private static final int DEFAULT_CODE_LENGTH = 4; private static final int DEFAULT_FONT_SIZE = 25; private static final int DEFAULT_LINE_NUMBER = 2; private static final int BASE_PADDING_LEFT = 10, RANGE_PADDING_LEFT = 15, BASE_PADDING_TOP = 15, RANGE_PADDING_TOP = 20; private static final int DEFAULT_WIDTH = 100, DEFAULT_HEIGHT = 40; //settings decided by the layout xml //canvas width and height private int width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT; //random word space and pading_top private int base_padding_left = BASE_PADDING_LEFT, range_padding_left = RANGE_PADDING_LEFT, base_padding_top = BASE_PADDING_TOP, range_padding_top = RANGE_PADDING_TOP; //number of chars, lines; font size private int codeLength = DEFAULT_CODE_LENGTH, line_number = DEFAULT_LINE_NUMBER, font_size = DEFAULT_FONT_SIZE; //variables private String code; private int padding_left, padding_top; private Random random = new Random(); //验证码图片 public Bitmap createBitmap() { padding_left = 0; Bitmap bp = Bitmap.createBitmap(width, height, Config.ARGB_8888); Canvas c = new Canvas(bp); code = createCode(); c.drawColor(Color.WHITE); Paint paint = new Paint(); paint.setTextSize(font_size); for (int i = 0; i code.length(); i++) { randomTextStyle(paint); randomPadding(); c.drawText(code.charAt(i) + "", padding_left, padding_top, paint); } for (int i = 0; i line_number; i++) { drawLine(c, paint); } c.save( Canvas.ALL_SAVE_FLAG );//保存 c.restore();// return bp; } public String getCode() { return code; } //验证码 private String createCode() { StringBuilder buffer = new StringBuilder(); for (int i = 0; i codeLength; i++) { buffer.append(CHARS[random.nextInt(CHARS.length)]); } return buffer.toString(); } private void drawLine(Canvas canvas, Paint paint) { int color = randomColor(); int startX = random.nextInt(width); int startY = random.nextInt(height); int stopX = random.nextInt(width); int stopY = random.nextInt(height); paint.setStrokeWidth(1); paint.setColor(color); canvas.drawLine(startX, startY, stopX, stopY, paint); } private int randomColor() { return randomColor(1); } private int randomColor(int rate) { int red = random.nextInt(256) / rate; int green = random.nextInt(256) / rate; int blue = random.nextInt(256) / rate; return Color.rgb(red, green, blue); } private void randomTextStyle(Paint paint) { int color = randomColor(); paint.setColor(color); paint.setFakeBoldText(random.nextBoolean()); //true为粗体,false为非粗体 float skewX = random.nextInt(11) / 10; skewX = random.nextBoolean() ? skewX : -skewX; paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜 // paint.setUnderlineText(true); //true为下划线,false为非下划线 // paint.setStrikeThruText(true); //true为删除线,false为非删除线 } private void randomPadding() { padding_left += base_padding_left + random.nextInt(range_padding_left); padding_top = base_padding_top + random.nextInt(range_padding_top); } }
Activity代码
package com.chao.createcode; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener { private ImageView iv_showCode; private EditText et_phoneCode; private EditText et_phoneNum; //产生的验证码 private String realCode; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_phoneCode = (EditText) findViewById(R.id.et_phoneCodes); Button but_toSetCode = (Button) findViewById(R.id.but_forgetpass_toSetCodes); but_toSetCode.setOnClickListener(this); iv_showCode = (ImageView) findViewById(R.id.iv_showCode); //将验证码用图片的形式显示出来 iv_showCode.setImageBitmap(Code.getInstance().createBitmap()); realCode = Code.getInstance().getCode(); iv_showCode.setOnClickListener(this); @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_showCode: iv_showCode.setImageBitmap(Code.getInstance().createBitmap()); realCode = Code.getInstance().getCode(); System.out.println(realCode); break; case R.id.but_forgetpass_toSetCodes: String phoneCode = et_phoneCode.getText().toString(); if(phoneCode.equalsIgnoreCase(realCode)){ Toast.makeText(MainActivity.this, phoneCode+"验证码正确", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, phoneCode+"验证码错误", Toast.LENGTH_SHORT).show(); break; }
布局XML
?xml version="1.0" encoding="utf-8"? LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="@color/main_color_white" TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="找回密码" android:textColor="@color/loan_butBackground" android:textSize="20sp" / /RelativeLayout LinearLayout android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginTop="30dp" android:orientation="vertical" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:background="@drawable/linearlayout01" LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical" android:orientation="horizontal" TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:text="中国+86" android:textColor="#A2CD5A" android:textSize="16sp" / View android:layout_width="0.1dp" android:layout_height="match_parent" android:background="@color/loan_butBackground" / EditText android:id="@+id/et_forgetPass_PhoneNum" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:background="@null" android:digits="0123456789" android:hint="请填入您的手机号" android:inputType="number" android:maxLength="11" android:textSize="16sp" / /LinearLayout /LinearLayout LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:layout_marginTop="20dp" android:orientation="horizontal" LinearLayout android:layout_width="wrap_content" android:layout_height="40dp" android:background="@drawable/linearlayout01" EditText android:id="@+id/et_phoneCodes" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="@null" android:hint="请输入右侧验证码" / /LinearLayout ImageView android:id="@+id/iv_showCode" android:layout_width="100dp" android:layout_marginLeft="10dp" android:layout_height="match_parent" / /LinearLayout Button android:id="@+id/but_forgetpass_toSetCodes" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="20dp" android:background="@drawable/buttonshape" android:text="获取手机验证码" android:textColor="@color/main_color_white" / /LinearLayout
参考网站:
http://dwtedx.com/itshare_349.html
本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1692459
图形验证码 图形验证码,防止恶意攻击者采用恶意工具批量注册账号或大量频繁调用某些请求,给服务器造成压力,占用大量的系统资源。本文介绍如何实现图形验证码?
C#图形验证码 图形验证码在生活中得到了广泛的应用,在很多登录页面都可以看到验证码的身影。之所以如此,是因为图形验证码可以隔绝不法分子的密码爆破,对我们的登录过程起到了至关重要的保护作用。
KgCaptcha 文字点选验证码数据监控 在信息时代, 对信息处理和利用能力的强弱成为决定企业兴衰成败的关键。一个成熟的数据监控展示平台是我们需要考虑的问题。 下面小编将用KgCaptcha,带领大家使用一个漂亮的数据监控展示平台!
KgCaptcha 图形验证码水印Logo修改 还在苦恼怎么让你的验证码显示Logo吗,KgCaptcha 这个验证码产品,你可以随心所欲地设置你想要的Logo图片、链接地址、位置等。下面我就给大家介绍一下如何设置吧?
KgCaptcha 图形验证码图片样式设置 在一次项目开发中,需要对滑动拼图验证码的宽高、拼图缺口、滑块等样式进行自定义设置,于是我找啊找,终于让我找到了 KgCaptcha,用户可以自己设置验证码尺寸、外框、缺口样式、滑块等。下面就由我来介绍一下如何设置吧!
文字点选行为验证码(KgCaptcha快速入门) 凯格行为验证码 - KgCaptcha,采用业界通用的API接口方式,对接轻松简单,即可享受带来的产品服务能力。自定义样式及风控等级,完全个性化的设置,与你的应用完美融合。自由定义验证场景、安全策略、素材管理、自定义底图、拼图素材、验证模式、验证偏好、背景图片、Logo、跳转链接。定制需求由业务专家制定解决方案,支持私有化部署、多语言切换。
相关文章
- 怎么把手机摄像头作为obs输入源
- 手机如何安装GreasyFork油猴js脚本?
- 坚果Pro2手机-搭建本地天堂2单机服务器
- AAAI2021 | 在手机上实现19FPS实时的YOLObile目标检测,准确率超高
- Android选择本地图片并裁剪工具类详解手机开发
- Android本地图片选择并裁剪工具类详解手机开发
- iOS开发实践之GET和POST请求详解手机开发
- DOM解析(GDataXMLNode)详解,xml解析手机开发
- 【swift】BlockOperation和GCD实用代码块详解手机开发
- [android] 采用服务录制电话&服务的生命周期详解手机开发
- android 获取Bitmap位图所占用的内存大小详解手机开发
- android开源项目下载地址详解手机开发
- Android Remote Views详解手机开发
- iOS–自定义相册—对象数组按照时间戳排序详解手机开发
- 微信小程序开发—小程序框架—小程序的视图层—4详解手机开发
- 体验华为鸿蒙 HarmonyOS 座舱,真能扔掉手机了
- 做工具不做手机,却让它成了手机界的“劳斯莱斯”!