Android开发中验证码的生成

近期在做电商金融类的项目,验证码的生成方法不可缺少。先学习了一种。经过測试好用。从别处学习的代码,稍修改了一下可选择是否支持识别大写和小写。直接上代码。

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.EditText;

import android.widget.ImageView;

import android.widget.Toast;

public class VerifyCodeActivity extends Activity {

private ImageView vc_image; // 验证码图标

private String getCode = null; // 获取验证码的值

private EditText vc_code; // 文本框的值

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.verifycode);

vc_image = (ImageView) findViewById(R.id.verify_imv);

vc_code = (EditText) findViewById(R.id.myedit);

getCode = SecurityCode.getInstance().getCode(false); // 获取显示的验证码

findViewById(R.id.vc_shuaxin).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

vc_image.setImageBitmap(SecurityCode.getInstance().getBitmap());

getCode = SecurityCode.getInstance().getCode(false);

}

});

findViewById(R.id.verfiy).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

String verfiyString = vc_code.getText().toString();

if (verfiyString.equals(getCode)) {

Toast.makeText(getApplicationContext(), "验证码输入正确", Toast.LENGTH_LONG).show();

} else {

Toast.makeText(getApplicationContext(), "验证码输入错误", Toast.LENGTH_LONG).show();

}

}

});

}

}

import java.util.Locale;

import java.util.Random;

import android.graphics.Bitmap;

import android.graphics.Bitmap.Config;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

/**

* @Description:验证码生成类

*/

public class SecurityCode {

private static final char[] CHARS = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘, ‘i‘, ‘j‘, ‘k‘, ‘l‘, ‘m‘, ‘n‘, ‘o‘, ‘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‘, ‘O‘, ‘P‘, ‘Q‘, ‘R‘, ‘S‘, ‘T‘, ‘U‘, ‘V‘, ‘W‘, ‘X‘, ‘Y‘, ‘Z‘ };

private static SecurityCode bpUtil;

public static SecurityCode getInstance() {

if (bpUtil == null)

bpUtil = new SecurityCode();

return bpUtil;

}

// default settings

private static final int DEFAULT_CODE_LENGTH = 4;// 验证码的长度 这里是4位

private static final int DEFAULT_FONT_SIZE = 60;// 字体大小

private static final int DEFAULT_LINE_NUMBER = 3;// 多少条干扰线

private static final int BASE_PADDING_LEFT = 20; // 左边距

private static final int RANGE_PADDING_LEFT = 35;// 左边距范围值

private static final int BASE_PADDING_TOP = 42;// 上边距

private static final int RANGE_PADDING_TOP = 15;// 上边距范围值

private static final int DEFAULT_WIDTH = 200;// 默认宽度.图片的总宽

private static final int DEFAULT_HEIGHT = 70;// 默认高度.图片的总高

private final int DEFAULT_COLOR = 0xdf;// 默认背景颜色值

// settings decided by the layout xml

// canvas width and height

private int width = DEFAULT_WIDTH;

private int height = DEFAULT_HEIGHT;

// random word space and pading_top

private int base_padding_left = BASE_PADDING_LEFT;

private int range_padding_left = RANGE_PADDING_LEFT;

private int base_padding_top = BASE_PADDING_TOP;

private int range_padding_top = RANGE_PADDING_TOP;

// number of chars, lines; font size

private int codeLength = DEFAULT_CODE_LENGTH;

private int line_number = DEFAULT_LINE_NUMBER;

private int font_size = DEFAULT_FONT_SIZE;

// variables

private String code;// 保存生成的验证码

private int padding_left, padding_top;

private Random random = new Random();

private Bitmap createBitmap() {

padding_left = 0;

Bitmap bp = Bitmap.createBitmap(width, height, Config.ARGB_8888);

Canvas c = new Canvas(bp);

code = createCode();

c.drawColor(Color.rgb(DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_COLOR));

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;

}

/**

* @Description:是否区分大写和小写

*/

public String getCode(boolean isMatchCase) {

if (isMatchCase) {

if (code != null) {

code.toLowerCase(Locale.getDefault());

}

} else {

return code;

}

return null;

}

public Bitmap getBitmap() {

return createBitmap();

}

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);

}

}

布局文件

<?

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" >

<ImageView

android:id="@+id/verify_imv"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

<Button

android:id="@+id/vc_shuaxin"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="获取验证码" />

<EditText

android:id="@+id/myedit"

android:layout_width="200dp"

android:layout_height="wrap_content"

android:hint="请输入验证码" />

<Button

android:id="@+id/verfiy"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="验证输入的验证码是否正确" />

</LinearLayout>

时间: 2024-12-28 12:21:13

Android开发中验证码的生成的相关文章

Android开发中出现cannot be resolved to a variable错误,也就是R文件不能生成。

最近开始学过习Android开发,配置完成开发环境后,在创建第一个Android项目就出现了cannot be resolved to a variable错误,也就是R文件不能生成的问题. 以下是从网上找到的解决方法 : Android开发过程中,碰到R cannot be resolved to a variable的报错信息,好像没有很确定的错误原因,一般来说,我总结出几个可能的解决方法,希望试过以后管用... 1. 检查Android 的SDK是否丢失需要重新下载,检查build pat

Builder模式详解及其在Android开发中的应用

一.引言 在Android开发中,采用Builder模式的代码随处可见,比如说Android系统对话框AlertDialog的使用或者是Android中的通知栏(Notification)的使用,又比如说在一些常用的第三方库中也随处可见其踪迹,比如说一些常用的网络请求库如OkHttp或者是retrofit,又或者是图片加载库Glide中也不缺乏它的应用. 为什么Builder模式在Android或是Java开发中这么火呢?因为它相较于构造函数或者是Get/Set方法,它的灵活性和封装性上都比较有

ASP.NET在实际开发中验证码的用法

在网上有看到很多关于验证码的代码,很多都只是生成一张验证码图片,然而在实际登陆验证模块,验证码要怎么添加进去或者说怎么运用.和实际项目开发中要怎么使用验证码,我自己总结了几点. 一.在实际开发登陆模块的验证码,程序员是将验证码的文本值(字符串)存在Session中的,然后在登陆验证的时候,通过Session取值进行判断的,这样效率会高很多. 二.然而在写验证码的时候要想通过Session存值,就必须实现System.Web.SessionState.IRequiresSessionState这个

Android开发中使用七牛云存储进行图片上传下载

Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储原理,上面这幅图片是官方给出的原理图,表述当然比较清晰了.可以看出,要进行图片上传的话可以分为五大步: 1. 客户端用户登录到APP的账号系统里面: 2. 客户端上传文件之前,需要向业务服务器申请七牛的上传凭证,这个凭证由业务服务器使用七牛提供的服务端SDK生成: 3. 客户端使用七牛提供的客户端S

Android开发中的问题及相应解决(持续更新)

最近博客写的少了,以后还得经常更新才行. ------------------------------------------------------------ 1.try cath 异常不全导致的意外问题. 之所以将此问题放在第一位,是因为前阵子中项目中出现了此类情况,并且这种情况很容易不注意或遗忘,但其错误却是致命的. 在Java/Android开发中,当调用一个函数时,此函数抛出一个A类型的异常,很自然的,在调用的地方我们会try.. catch此异常,并且绝大多数情况下,捕获异常是由E

android开发中常犯的几个错误整理

新手程序猿,在开发中难免会犯各种各样的错误,以下是整理的一些android开发中常见的错误,一起来看看吧. 1.避免将多个类放在一个文件夹里面,除非是一次性使用的内部类. 就是一个文件,最好给分它同名的主类. 2.一个方法的代码长度最好不要超过35行 就是我们这个方法,别把它写的太长, 像是翻了几行的方法,要么拆分成几个方法,把里面很多公用的方法拿出来放在另外一个函数里,要不重构. 3.原则上,尽量不要手工的修改机器产生的代码 比方说,android项目中的R.java类 还有自动生成的类,也不

Android 开发中的日常积累

欢迎Star,Fork https://github.com/lizhangqu/CoreLink 里面记录了开发过程中有用的东西,欢迎补充,不定时更新. Android 性能优化 Android内存优化之OOM Android最佳性能实践(1):合理管理内存 Android最佳性能实践(2):分析内存的使用情况 Android最佳性能实践(3):高性能编码优化 Android最佳性能实践(4):布局优化技巧 Android 加固与反编译 Apktool dex2jar DecompileApk

Android开发中Eclispe相关问题及相应解决(持续更新)

1.Eclipse项目中的Android Private Libraries没有自动生成. 一般而言,在Android开发中,项目中引用到的jar包会放到项目目录中的libs中,引入库会放到Android Dependencies中,对于放置于libs中的jar包,会自动置于项目中的Android Private Libraries下,如果没有自动生成,clean项目后一般在console下会发现有相应的错误提示,修正即可.如:项目中引用了不同的v4兼容包等会出现此类情况. 2.Eclipse中

android开发中R文件丢失

R文件在android开发中,占据着中会在重要的地位,里面的内容有系统自动生成,不可随意修改,然而在开发过程中,总是不可知的丢失,这里总结一下修补方法 #.在Eclipse里可以 (1).在不能确认xml文件或图片文件没有错误的情况下,最好不要clear,因为这时只要一clear,那么R文件就会没了,而在众多的xml文件里面找出错误确实不是一件容易的事. (2).如果R文件已经丢失,可以 右键项目-->Android Tools--> fix project properties, (3).检