Android生成随机验证码技术

在Android客户端应用开发中,往往需要短信验证码或者随机验证码来限制用户的操作或者认证。短信验证码是为了对用户进行认证,主要通过Http协议等通信协议实现;随机验证码很大程度是为限制或者提示用户相关操作。随机验证码的验证主要有两种方式:请求服务器验证,本地验证。比如,在用户向服务器发送登录请求,我们通过随机验证码(本地验证即可)限制用户随意按请求按钮,演示如下:

源码实战

(1)src/.../createCode.java

功能:使用Random、Canvas、Paint及其相关方法创建包含4个显示风格、位置不同字符的位图。

package com.example.randomcode;
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;

/**
 *	项目名称/版本号:RandomCode/v1.0
 *	包   名:com.example.randomcode
 *	类描述:(1)生成一组随机数;
 *	  (2)设置随机数风格,并绘制canvas.drawText()到位图上
 *	  (3)再在位图上绘制风格变化的干扰线条
 *	创建人:jiangdongguo
 *	创建时间:2015-6-6 下午3:22:41
 * 博客地址:http://blog.csdn.net/u012637501
 */
public class createCode {
 private static final char[] CHARS = { '1', '2', '3', '4', '5', '6', '7',
  '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'l',
  '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 final int CodeLength = 4; // 随机数个数
 private static final int LineNumber =8;	 //线条数目
 private static final int WIDTH =140, HEIGHT = 80; // 位图长、宽
 private static final int FontSize = 40;	 //随机数字体大小
 private static int base_padding_left ;
 private static final int random_padding_left = 23,
   base_padding_top = 45, random_padding_top = 10;
 private static Random random = new Random();

 /*********************************************************************************
  *	方  法 名:createRandomBitmap
  *	功能描述:生成随机验证码视图
  *  Data     :2015-6-6[J]
 *********************************************************************************/
 public static Bitmap createRandomBitmap(){
  /**
   * (1)生成一组随机数
   * */
  String code = createRandomText();	 //生成4个随机数
  /***
   * (2)创建位图Bitmap,画布Canvas,初始化画笔Paint
   * */
  Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Config.ARGB_8888);	//创建位图,并指定其长、宽
  Canvas canvas = new Canvas(bitmap);	 //创建指定位图的画布
  canvas.drawColor(Color.WHITE);	 //设置画布的背景为白色
  Paint paint = new Paint();	 //定义画笔paint
  paint.setTextSize(FontSize);	 //设置画笔字体大小
  /**
   * (3)生成四个随机数风格各异(颜色、位置、形状)的位图
   * */
  base_padding_left = 20;
  for(int i=0;i<code.length();i++){
   //设置一个随机数的风格
   int color = RandomColor();
   paint.setColor(color);	 //设置(画笔)该随机数的颜色
   paint.setFakeBoldText(false);//设置画笔为非粗体
   float skewX = random.nextInt(11)/10;
   skewX = random.nextBoolean() ? skewX :(-skewX);
   paint.setTextSkewX(skewX);	//设置字体倾斜方向(负数表示右斜,整数表示左斜)
   //设置一个随机数位置
//	 int padding_left = base_padding_left + random.nextInt(random_padding_left);
   int padding_top =base_padding_top + random.nextInt(random_padding_top);
   //绘制该随机数
   canvas.drawText(code.charAt(i)+"" ,base_padding_left, padding_top, paint);
   base_padding_left += random_padding_left;
  }
  /**
   * (4)绘制线条
   **/
  for(int i=0;i<LineNumber;i++){
   mdrawLine(canvas, paint);
  }
  canvas.save(Canvas.ALL_SAVE_FLAG);	//保存
  canvas.restore();
  return bitmap;
 }

 /*********************************************************************************
  *	方  法 名:createRandomText
  *	功能描述:
  *  Data     :2015-6-6[J]
  *********************************************************************************/
 private static String createRandomText(){
  StringBuilder buffer = new StringBuilder();
  for(int i=0;i<CodeLength;i++){
   buffer.append(CHARS[random.nextInt(CHARS.length)]);	//CHARS下标限定在0~CodeLength之间
  }
  return buffer.toString();	 //生成4个随机数
 }
 /********************************************************************************
  *	方  法 名:RandomColor
  *	功能描述:生成一个随机颜色
  *  Data     :2015-6-6[J]
  *********************************************************************************/
 private static int RandomColor(){
  int red = random.nextInt(256);	 //红色:0~256之间
  int green = random.nextInt(256);	 //绿色:0~256之间
  int blue = random.nextInt(256);	 //蓝色:0~256之间
  return Color.rgb(red, green, blue);	//返回生成随机颜色值
 }
 /*********************************************************************************
  *	方  法 名:mdrawLine
  *	功能描述:绘制一条线条,参数:当前画布,当前画笔
  *  Data     :2015-6-6[J]
  **********************************************************************************/
 private static void mdrawLine(Canvas canvas,Paint paint){
  //a.设置该线条颜色
  int color = RandomColor();
  paint.setColor(color);
  //b.设置该随机数的位置(起点和终点,0~WIDTH,0~HEIGHT)
  int startX = random.nextInt(WIDTH);
  int startY = random.nextInt(HEIGHT);
  int stopX = random.nextInt(WIDTH);
  int stopY = random.nextInt(HEIGHT);
  canvas.drawLine(startX, startY, stopX, stopY, paint);
 }
}

注释:创建随机字符位图的关键在于设计每个字符在位图上的显示位置,若每个字符显示的上下、左右边距不合适,字符将在位图上显示不出来。特别要注意每个字符的左右边距,代码如下:

private static int base_padding_left ;

private static final int random_padding_left = 23,

base_padding_top = 45, random_padding_top = 10;

base_padding_left = 20;            //第一个字符到位图左边界距离

for(int i=0;i<code.length();i++){

//设置该字符能显示距离位图垂直位置

int padding_top =base_padding_top + random.nextInt(random_padding_top);

canvas.drawText(code.charAt(i)+"" ,base_padding_left, padding_top, paint);

base_padding_left += random_padding_left;        //调整该字符与前一个字符的间隔距离

}

(2)src/.../MainActivity.java

功能:将创建好的位图显示到界面布局的ImageButton组件中

package com.example.randomcode;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final ImageButton imageButton = (ImageButton)findViewById(R.id.myImage);
        imageButton.setImageBitmap(createCode.createRandomBitmap());
        imageButton.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {
             imageButton.setImageBitmap(createCode.createRandomBitmap());
   }
  });
    }
}

(3)res/layout/main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ImageButton
        android:id="@+id/myImage"
        android:layout_width="160dp"
        android:layout_height="80dp"
        android:layout_centerInParent="true" />
</LinearLayou>

(4)效果演示

时间: 2024-10-15 06:08:37

Android生成随机验证码技术的相关文章

android 客户端生成随机验证码的实现

由于项目中要用到验证码,自己找了些资料,试着就把这个验证码给做了出来,代码不是很多,比较的简单,下面给大家看看我是怎么实现该功能的: 源码地址下载:http://download.csdn.net/detail/u014608640/7268905 首先当然是写XML咯,贴上代码 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" andr

学习python:实例2.用PIL生成随机验证码

效果: 代码: # 生成随机验证码图片 import string from random import randint, sample from PIL import Image, ImageDraw, ImageFont, ImageFilter # Image 负责处理图片 # ImageDraw 画笔 # ImageFont 文字 # ImageFileter 滤镜 # 定义变量 img_size = (150,50)        # 定义画布大小 img_rgb = (255,255

Python 生成随机验证码

Python生成随机验证码 Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 from PIL import Image img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255)) # 在图片查看器中打开 # img.show()  # 保存在本地 with open('code.png','wb') as f

生成随机验证码工具类

生成随机验证码 package com.web; //验证码生成处理类 import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.awt.ima

如何生成随机验证码

Python生成随机验证码 Python生成随机验证码,需要使用PIL模块. 安装: pip3 install pillow 基本使用 1. 创建图片 from PIL import Image img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255)) # 在图片查看器中打开 # img.show() # 保存在本地 with open('code.png','wb') as f: img.save(f,format='

生成随机验证码

生成随机验证码实例 import random a=[] c ='' for i in range(6): if i == random.randrange(1,4): a.append(str(random.randint(1,9))) else: temp = random.randint(65,90) a.append(chr(temp)) print a b="".join(a) print b for i in a: c += str(i) print c 输出为 ['D',

pillow实例 | 生成随机验证码

1 PIL(Python Image Library) PIL是Python进行基本图片处理的package,囊括了诸如图片的剪裁.缩放.写入文字等功能.现在,我便以生成随机验证码为例,讲述PIL的基本用法. PIL库似乎已经被人抛弃,就为更新,上次使用时竟然不能用show()直接将图片,在系统默认的图片管理器中打开.好在pillow,一个PIL的方言,将PIL继续维护了下去. 生成验证码一般需要对写入的文字进行旋转.扭曲.变色等一系列操作,才能避免计算机算法的识别. 因此定义一个生成验证码的类

python生成随机验证码

Python 生成随机验证码,需安装 PIL模块 安装: pip3 install pillow 基本使用 1,.创建图片 from PIL import Image img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255)) # 在图片查看器中打开 # img.show() # 保存在本地 with open('code.png','wb') as f: img.save(f,format='png') 2.创建画笔,用

struts2生成随机验证码图片

之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用struts2实现了一下,现在将我自己实现代码贴出来!大家有什么意见都可以指出来! 首先是生成随机验证码图片的action: CreateImageAction: package com.xiaoluo.action; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedIm