android图形验证码

Android图形验证码 阅读详情

废话不多说上效果图:

给上activity_main.xml布局代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:orientation="vertical">
        <ImageView 
            android:id="@+id/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:src="@drawable/ic_launcher"/>
        <EditText 
            android:id="@+id/et"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:hint="输入验证码"/>
        <Button 
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="获得验证码"/>
        <Button 
            android:id="@+id/btn_submit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="提交"/>
    </LinearLayout>

</RelativeLayout>

再上mainactivity代码:
package com.example.codedemo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
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 image;
	private EditText et;
	private Button btn,submit;
	private String codeStr;
	private CodeUtils codeUtils;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		initView();
		
	}

	private void initView() {
		image = (ImageView) findViewById(R.id.image);
		et = (EditText) findViewById(R.id.et);
		btn = (Button) findViewById(R.id.btn);
		submit = (Button) findViewById(R.id.btn_submit);
		btn.setOnClickListener(this);
		submit.setOnClickListener(this);
		
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn:
			codeUtils = CodeUtils.getInstance();
			Bitmap bitmap = codeUtils.createBitmap();
			image.setImageBitmap(bitmap);
			
			break;
		case R.id.btn_submit:
			codeStr = et.getText().toString().trim();
			Log.e("codeStr", codeStr);
			if (null == codeStr || TextUtils.isEmpty(codeStr)) {
				Toast.makeText(this, "请输入验证码", 0).show();
				return;
			}
			String code = codeUtils.getCode();
			Log.e("code", code);
			if (code.equalsIgnoreCase(codeStr)) {
				Toast.makeText(this, "验证码正确", 0).show();
			} else {
				Toast.makeText(this, "验证码错误", 0).show();
			}
			break;
		default:
			break;
		}
		
	}
}

最后附上CodeUtils代码:
package com.example.codedemo;

import android.graphics.Bitmap;  
import android.graphics.Bitmap.Config;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Paint;  
  
import java.util.Random;  
  
/** 
 * Created by yao 
 * 用于图片验证码的工具类 
 */  
public class CodeUtils {  
    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 CodeUtils mCodeUtils;  
    private int mPaddingLeft, mPaddingTop;  
    private StringBuilder mBuilder = new StringBuilder();  
    private Random mRandom = new Random();  
  
    //Default Settings  
    private static final int DEFAULT_CODE_LENGTH = 6;//验证码的长度  这里是6位  
    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 = 30;//左边距范围值  
    private static final int BASE_PADDING_TOP = 70;//上边距  
    private static final int RANGE_PADDING_TOP = 15;//上边距范围值  
    private static final int DEFAULT_WIDTH = 300;//默认宽度.图片的总宽  
    private static final int DEFAULT_HEIGHT = 100;//默认高度.图片的总高  
    private static final int DEFAULT_COLOR = 0xDF;//默认背景颜色值  

	private String code;
  
    public static CodeUtils getInstance() {  
        if(mCodeUtils == null) {  
            mCodeUtils = new CodeUtils();  
        }  
        return mCodeUtils;  
    }  
  
    //生成验证码图片  
    public Bitmap createBitmap() {  
        mPaddingLeft = 0; //每次生成验证码图片时初始化  
        mPaddingTop = 0;  
  
        Bitmap bitmap = Bitmap.createBitmap(DEFAULT_WIDTH, DEFAULT_HEIGHT, Config.ARGB_8888);  
        Canvas canvas = new Canvas(bitmap);  
  
        code = createCode();  
  
        canvas.drawColor(Color.rgb(DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_COLOR));  
        Paint paint = new Paint();  
        paint.setTextSize(DEFAULT_FONT_SIZE);  
  
        for (int i = 0; i < code.length(); i++) {  
            randomTextStyle(paint);  
            randomPadding();  
            canvas.drawText(code.charAt(i) + "" , mPaddingLeft, mPaddingTop, paint);  
        }  
  
        //干扰线  
        for (int i = 0; i < DEFAULT_LINE_NUMBER; i++) {  
            drawLine(canvas, paint);  
        }  
  
        canvas.save(Canvas.ALL_SAVE_FLAG);//保存  
        canvas.restore();  
        return bitmap;  
    }  
    /**
     * 得到图片中的验证码字符串
     * @return 
     */
    public String getCode() {
    	return code;
    }
  
    //生成验证码  
    public String createCode() {  
        mBuilder.delete(0, mBuilder.length()); //使用之前首先清空内容  
  
        for (int i = 0; i < DEFAULT_CODE_LENGTH; i++) {  
            mBuilder.append(CHARS[mRandom.nextInt(CHARS.length)]);  
        }  
  
        return mBuilder.toString();  
    }  
  
    //生成干扰线  
    private void drawLine(Canvas canvas, Paint paint) {  
        int color = randomColor();  
        int startX = mRandom.nextInt(DEFAULT_WIDTH);  
        int startY = mRandom.nextInt(DEFAULT_HEIGHT);  
        int stopX = mRandom.nextInt(DEFAULT_WIDTH);  
        int stopY = mRandom.nextInt(DEFAULT_HEIGHT);  
        paint.setStrokeWidth(1);  
        paint.setColor(color);  
        canvas.drawLine(startX, startY, stopX, stopY, paint);  
    }  
  
    //随机颜色  
    private int randomColor() {  
        mBuilder.delete(0, mBuilder.length()); //使用之前首先清空内容  
  
        String haxString;  
        for (int i = 0; i < 3; i++) {  
            haxString = Integer.toHexString(mRandom.nextInt(0xFF));  
            if (haxString.length() == 1) {  
                haxString = "0" + haxString;  
            }  
  
            mBuilder.append(haxString);  
        }  
  
        return Color.parseColor("#" + mBuilder.toString());  
    }  
  
    //随机文本样式  
    private void randomTextStyle(Paint paint) {  
        int color = randomColor();  
        paint.setColor(color);  
        paint.setFakeBoldText(mRandom.nextBoolean());  //true为粗体,false为非粗体  
        float skewX = mRandom.nextInt(11) / 10;  
        skewX = mRandom.nextBoolean() ? skewX : -skewX;  
        paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜  
//        paint.setUnderlineText(true); //true为下划线,false为非下划线  
//        paint.setStrikeThruText(true); //true为删除线,false为非删除线  
    }  
  
    //随机间距  
    private void randomPadding() {  
        mPaddingLeft += BASE_PADDING_LEFT + mRandom.nextInt(RANGE_PADDING_LEFT);  
        mPaddingTop = BASE_PADDING_TOP + mRandom.nextInt(RANGE_PADDING_TOP);  
    }  
}  
其中,在Default Settings中可以设置验证码图形的大小,验证码的长度,内边距,随机距离等可以根据需要进行调整。
android 生产图形验证码 原理很简单,首先封装一个类,里面是绘制的图形验证码的一些信息,比如,验证码字符串,验证码长度,干扰线等等,这个网上有很多,我也是参考某个的的封装类写的,下面先上效果图:代码如下:package com.imageverification; import android.graphics.Bitmap; import android.graphics.Canvas; import android.... 阅读详情

相关推荐

Android注册短信验证码加图形验证码防止被刷

一.ImageView控件接收图片验证码,点击事件刷新图片验证码。访问接口,更新ImageView即可。二.因为图形验证码的值要上传给服务器验证,并且服务器是使用Session保存这个验证码。所以要保证图片验证码接口和获取短信验证码接口在一个Session中。方法:1.访问图形验证码接口时将sessionId保存到常量类中的静态变量中。2.在访问获取短信验证接口将sessionId放在Cookie...

qq_28709793的博客 1363

Android生成简单的图片验证码

暑假的班级项目登录界面用到了验证码,就想着简单点弄个图片验证码好了。看了几篇文章还是有点儿懵。然后耐着性子把一篇关于验证码的文章分析了一下。果然还是得有耐心才行啊。 ╰( ̄ω ̄o)   虽然大致是做出来了,但是还有个小bug,就是文字会出界的问题,如果有更好的解决方案的,欢迎提出呀!(~o ̄3 ̄) 大概是参照这篇博客的:https://blog.youkuaiyun.com/wk843620202/art...

BFELFISH的博客 6893

Android 接口获取验证码图片(全)

获取验证码图片的原理是通过与服务器进行通信,请求验证码图片的接口,并将服务器返回的验证码图片数据显示在应用程序中。随着技术的进步,未来的应用程序可能会采用更高级的验证码技术,如滑动验证码、语音验证码等。这个过程是在服务器端完成的,Android 应用程序只需要通过网络请求接口获取验证码图片的数据,并在应用中显示。在 Android 应用程序中,获取验证码图片是一种常见的需求,用于图形验证码验证。通过使用接口获取验证码图片,可以在应用中显示验证码,并进行用户输入的验证。接口用于处理请求的结果。

走向CTO的路上... 691

Android图片验证码

public class ValidateImageView extends View{ private String TAG = “ValidateImageView”; private Paint paint = new Paint(); /* * 验证码内容 */ private String[] content = null;

TeaeMr 515

提高Android应用中图形验证码的识别率

除了图形验证码外,还可以结合音频验证码进行辅助识别,提高验证码的识别率。综上所述,通过图像处理技术增强图形验证码的清晰度和对比度,使用机器学习算法训练验证码识别模型,以及结合音频验证码进行辅助识别,可以有效提高Android应用中图形验证码的识别率。通过运行上述代码,可以得到一个增强过的图形验证码图片(enhanced_captcha.png)和边缘检测结果(captcha_edges.png),这些处理后的图像可以提供更好的识别效果。训练完成后,可以使用该模型对新的图形验证码进行预测,提高识别率。

2301_78484069的博客 181

android 验证码图片的一种实现

android 验证码图片的一个小Demo,基础功能都,有了,包括点击更新,产生随机数,验证码位置动态变化等,大家下载后可按需修改。

android 验证码的图形,(转)Android 之生成图形验证码

1 import android.graphics.Bitmap;2 import android.graphics.Canvas;3 import android.graphics.Color;4 import android.graphics.Paint;5 import java.util.Random;67 /**8 * Created by ekikousei易皇星 on 16/11/...

weixin_29535577的博客 566

java识别图片验证码的2种方式

包含5个识别图片验证码的类,分别对应不同5种不同的验证码 其中用了两种不同的实现方式(截取采样像素比对+Tesseract-OCR识别) 附带一个图像指纹类(判定图片相似度)和一个寻找联通线的类(八皇后算法实现)

安卓图形验证码---防止暴力尝试对软件的冲击

如图所示:图形验证码防止被大量注册刷爆。 //主体代码 public class VerificationCode { private static final char[] CHARS = { '0','1','2','3','4','5','6','7','8','9', 'a', 'b', 'c', 'd', 'e', 'f', '...

weixin_43605701的博客 419

保姆级教程:在瑞芯微RV1126B上部署轻量化YOLOv8,实现端侧实时目标检测

本文详细介绍了在瑞芯微RV1126B芯片上部署轻量化YOLOv8模型的完整流程,包括开发环境搭建、模型训练优化、量化转换及嵌入式部署。通过利用RV1126B的3TOPS NPU算力和AI-ISP特性,实现端侧实时目标检测,提升边缘AI应用的性能和效率。

weixin_30329623的博客 267

【实验】Linux下完全卸载oracle单实例(亲身体验完整版)

停止oracle数据库服务 停止监听 卸载数据库实例 因为自己懒得再弄dbca图形化界面啥的,直接采用dbca静默删除数据库实例,命令如下 dbca -silent -deleteDatabase -sourcedb orclhq -sid orcl -sysDBAUserName orcl -sysDBAPassword zte [oracle@slave ~]$ dbca -silent ...

萝卜吃鱼914的博客 1945

android请求动态验证码,androidstudio实现图形验证码

androidstudio实现图形验证码xml文件:android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal">android:id="@+id/et_loginactivity_phoneCodes"android:layout_width="...

weixin_42471237的博客 627

FOC无刷电机磁编码器机械角度与电角度自动对齐校准及电机极对数自动获取的方法

本文提出磁编码器机械角度与电角度自动对齐校准方法及电机极对数自动获取方案。通过通直流电流使转子定向,读取机械角度并计算电角度偏移量,实现精确对齐;同时利用低速旋转时检测反电动势过零点次数,结合机械角度变化量自动计算极对数。核心算法包括转子定向、偏移量计算、极对数推导等步骤,并提供了基于STM32的C语言实现代码。该方法适用于工业伺服、机器人等高精度控制场景,需注意负载安全、参数调整和误差处理。两种自动化流程可有效解决电机安装调试中的角度对齐和参数识别问题。

qq_29653575的博客 2484

前端使用阿里云图形验证码;并且与安卓进行交互

最近安卓同事那边没办法去用原生的图形验证码;要前端写个html内嵌进去,下面是流程如何实现的: 自己又定义了一个 CONFIG: 初始化阿里云验证码实例 在 里: 逻辑: element: ‘#captcha-element’:验证码挂载在页面中这个 div 上。 button: ‘#verify-btn’:点击“开始验证”按钮时,弹出/触发验证码。 captchaVerifyCallback:用户通过验证码后,阿里云前端 SDK 会给你一个 captchaVerifyParam,然后会调用这个

piaocanY的博客 1402

TiDB实战篇-数据库写入慢常见处理方式

TiDB实战篇-数据库写入慢常见处理方式

S1124654的博客 1010

从梯度泄露到数据复原:DLG与iDLG算法实战解析

本文深入解析了DLG与iDLG算法在梯度泄露与数据复原中的实战应用,揭示了联邦学习中的隐私风险。通过详细代码示例和实验数据,展示了如何从梯度中复原原始训练数据,并探讨了梯度压缩、差分隐私等防御措施。文章特别强调了iDLG算法在标签破解中的高效性,为AI安全领域提供了重要参考。

weixin_30552811的博客 191

(转)Android 之生成图形验证码

1 import android.graphics.Bitmap; 2 import android.graphics.Canvas; 3 import android.graphics.Color; 4 import android.graphics.Paint; 5 import java.util.Random; 6 7 /** ...

ZHANGXIAOYU55692的博客 219

systemView的安装使用

systemView的安装使用

qq_33712422的博客 3966

android本地验证代码,手机端产生本地图形验证码

生成图形验证码校验类packagecom.chao.createcode;importjava.util.Random;importandroid.graphics.Bitmap;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.g...

weixin_34474759的博客 279

一文看懂 SAP Integration Suite:从架构治理、接口编排到事件驱动的集成全景

SAP Integration Suite是企业数字化转型中的关键集成平台,通过统一的方法论和工具链解决系统互联、数据对齐和流程协同等复杂问题。其核心能力包括:1)集成评估(Integration Assessment)提供战略规划框架;2)迁移评估(Migration Assessment)支持从传统平台向云的平滑过渡;3)云集成(Cloud Integration)实现日常业务流程编排;4)集成顾问(Integration Advisor)简化B2B标准映射;5)贸易伙伴管理(TPM)优化外部协作流程;

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 501

基于Simulink的加速度计振动分析:单自由度质量-弹簧-阻尼系统

摘要:基于Simulink的加速度计单自由度振动分析 本文研究了加速度计的单自由度(SDOF)质量-弹簧-阻尼系统模型,通过MATLAB/Simulink平台建立了完整的振动分析仿真系统。文章详细阐述了理论建模过程,推导了系统运动微分方程和传递函数,并提供了Simulink模型搭建的具体步骤和MATLAB实现代码。研究通过正弦扫频、随机振动和冲击响应三种典型输入信号,分析了系统的幅频特性、相频特性及时域响应,验证了加速度计的工作机理。仿真结果表明,该方法能有效模拟加速度计在不同激励条件下的动态特性,为传感器

AI的内部世界的博客 163

Android 之生成图形验证码

转载自:https://blog.youkuaiyun.com/jky_yihuangxing/article/details/53301834很简单,直接上代码了。import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Pain...

wolfking0608的博客 369

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

安卓:手机端产生本地图形验证码

转自:http://tianxingzhe.blog.51cto.com/3390077/1692459生成图形验证码校验类123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737...

我的博客 734

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 解决三星调用系统相机拍照显示图片旋转90度横着的问题
下一篇: android最简单的生成二维码demo
coder_yao
博客等级 码龄10年 9粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值