2017-08-16 1 views
0

Ich versuche, das Captcha in meinem Registrierungsformular zu überprüfen, das im Projekt aus einer Java-Datei statisch generiert wird. Aber ich kann die Bedingung nicht zurückverfolgen, um das Captcha zu überprüfen, die ganze Zeit, die es falsch zeigt. Ob Captchabegriff oder nicht, es zeigt immer ein ungültiges Captcha an. Unten ist der Code.was wird die Bedingung sein, um captcha zu überprüfen

mainactivity.java

     Submit_btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //isValidData(); 
      if (isValidData()){ 
       if (textCaptcha.checkAnswer(Usercapt.getText().toString().trim())) { 
        /*AlertDialog.Builder alt = new AlertDialog.Builder(MainActivity.this); 
        alt.setMessage("Invalid Captcha"); 
        alt.setCancelable(true); 
        alt.setPositiveButton("ok", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          dialog.dismiss(); 
         } 
        }); 
        AlertDialog alertDialog = alt.create(); 
        alertDialog.show();*/ 
        Toast.makeText(MainActivity.this, "captch match", Toast.LENGTH_SHORT).show(); 

       } else{ 
        /* Toast.makeText(MainActivity.this, "Successful Registration", Toast.LENGTH_SHORT).show(); 
        Intent i = new Intent(MainActivity.this, Login_Activity.class); 
        startActivity(i);*/ 
        Toast.makeText(MainActivity.this, "captcha not match", Toast.LENGTH_SHORT).show(); 

       } 
      } else { 

       /*here the code to save the data in data base will be written*/ 
       Toast.makeText(MainActivity.this, "Registration Failed, Register again", Toast.LENGTH_SHORT).show(); 

      } 

     } 
    }); 

Captcha.java

 package com.mws.tms_application; 

    import android.graphics.Bitmap; 
import android.graphics.Color; 

import java.util.List; 
import java.util.Random; 



public abstract class Captcha { 
protected Bitmap image; 
protected String answer = ""; 
private int width; 
protected int height; 
protected int x = 0; 
protected int y = 0; 
protected static List usedColors ; 

protected abstract Bitmap image(); 

public static int color(){ 
    Random r = new Random(); 
    int number; 
    do{ 
     number = r.nextInt(9); 
    }while(usedColors.contains(number)); 
    usedColors.add(number); 
    switch(number){ 
     case 0: return Color.BLACK; 
     case 1: return Color.BLUE; 
     case 2: return Color.CYAN; 
     case 3: return Color.DKGRAY; 
     case 4: return Color.GRAY; 
     case 5: return Color.GREEN; 
     case 6: return Color.MAGENTA; 
     case 7: return Color.RED; 
     case 8: return Color.YELLOW; 
     case 9: return Color.WHITE; 
     default: return Color.WHITE; 
    } 
} 

public int getWidth(){ 
    return this.width; 
} 

public void setWidth(int width){ 
    if(width > 0 && width < 10000){ 
     this.width = width; 
    }else{ 
     this.width = 300; 
    } 
} 

public int getHeight(){ 
    return this.height; 
} 

public void setHeight(int height){ 
    if(height > 0 && height < 10000){ 
     this.height = height; 
    }else{ 
     this.height = 100; 
    } 
} 

public Bitmap getImage() { 
    return this.image; 
} 

public boolean checkAnswer(String ans) { 
    /*System.out.println("ans received here"+ans); 
    System.out.println("captcha"+answer);*/ 
    return (ans.equals(this.answer)); 


} 
} 

textcaptcha.java

  package com.mws.tms_application; 

import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.LinearGradient; 
import android.graphics.Paint; 
import android.graphics.Shader; 

import java.io.CharArrayWriter; 
import java.util.ArrayList; 
import java.util.Random; 



public class TextCaptcha extends Captcha { 

protected TextOptions options; 
private int wordLength; 
private char mCh; 

public enum TextOptions { 
    UPPERCASE_ONLY, 
    LOWERCASE_ONLY, 
    NUMBERS_ONLY, 
    LETTERS_ONLY, 
    NUMBERS_AND_LETTERS 
} 

public TextCaptcha(int wordLength, TextOptions opt) { 
    new TextCaptcha(0, 0, wordLength, opt); 
} 

public TextCaptcha(int width, int height, int wordLength, TextOptions opt) { 
    setHeight(height); 
    setWidth(width); 
    this.options = opt; 
    usedColors = new ArrayList<>(); 
    this.wordLength = wordLength; 
    this.image = image(); 
} 

@Override 
protected Bitmap image() { 
    LinearGradient gradient = new LinearGradient(0, 0, getWidth()/this.wordLength, getHeight()/2, color(), color(), Shader.TileMode.CLAMP); 
    Paint p = new Paint(); 
    p.setDither(true); 
    p.setShader(gradient); 
    Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(bitmap); 
    c.drawRect(0, 0, getWidth(), getHeight(), p); 
    Paint tp = new Paint(); 
    tp.setDither(true); 
    tp.setTextSize(getWidth()/getHeight() * 20); 

    Random r = new Random(System.currentTimeMillis()); 
    CharArrayWriter cab = new CharArrayWriter(); 
    this.answer = " "; 
    for (int i = 0; i < this.wordLength; i++) { 
     char ch = ' '; 
     switch (options) { 
      case UPPERCASE_ONLY: 
       ch = (char) (r.nextInt(91 - 65) + (65)); 
       break; 
      case LOWERCASE_ONLY: 
       ch = (char) (r.nextInt(123 - 97) + (97)); 
       break; 
      case NUMBERS_ONLY: 
       ch = (char) (r.nextInt(58 - 49) + (49)); 
       break; 
      case LETTERS_ONLY: 
       ch = getLetters(r); 
       break; 
      case NUMBERS_AND_LETTERS: 
       ch = getLettersNumbers(r); 
       break; 
      default: 
       ch = getLettersNumbers(r); 
       break; 
     } 
     cab.append(ch); 
     this.answer += ch; 
    } 

    char[] data = cab.toCharArray(); 
    for (int i = 0; i < data.length; i++) { 
     this.x += (30 - (3 * this.wordLength)) + (Math.abs(r.nextInt()) % (65 - (1.2 * this.wordLength))); 
     this.y = 50 + Math.abs(r.nextInt()) % 50; 
     Canvas cc = new Canvas(bitmap); 
     tp.setTextSkewX(r.nextFloat() - r.nextFloat()); 
     tp.setColor(color()); 
     cc.drawText(data, i, 1, this.x, this.y, tp); 
     tp.setTextSkewX(0); 
    } 
    return bitmap; 
} 

private char getLetters(Random r) { 
    int rint = (r.nextInt(123 - 65) + (65)); 
    if (((rint > 90) && (rint < 97))) 
     getLetters(r); 
    else 
     mCh = (char) rint; 
    return mCh; 
} 

private char getLettersNumbers(Random r) { 
    int rint = (r.nextInt(123 - 49) + (49)); 

    if (((rint > 90) && (rint < 97))) 
     getLettersNumbers(r); 
    else if (((rint > 57) && (rint < 65))) 
     getLettersNumbers(r); 
    else 
     mCh = (char) rint; 
    return mCh; 
} 
} 
+0

zu initialisieren, wo Sie asigned Wert – Anil

+0

antworten es wird von einer anderen Java-Datei generiert –

+0

enthält es Buchstaben? oder Zahlen nur die "Antwort"? – Yazan

Antwort

0

Das ist es

Sie initialisieren answer mit einem Spa ce, nicht leere Zeichenkette:

this.answer = " "; 

Antwort wird wie diese "1234567" gefüllt werdenMitteilung der führende Raum.

entweder initialisieren mit leeren String:

this.answer = ""; 

oder trim() auf answer verwenden, wenn

vergleichen
public boolean checkAnswer(String ans) { 
    /*System.out.println("ans received here"+ans); 
    System.out.println("captcha"+answer);*/ 
    return (ans.equals(this.answer.trim())); 
} 

empfohlene Methode ist leer Zeichenfolge mit answer

+0

danke @ Yazan, aber es arbeitet mit trim(), es funktioniert nicht mit der Initialisierung leerer Zeichenfolge. –

+0

@ShubhamKanugo das ist seltsam, ist es möglich, dass einige der Methoden ein Leerzeichen basierend auf 'r', ex' getLettersNumbers (r) 'zurückgeben können? – Yazan

+0

ja es ist seltsam, aber es funktioniert :) –

Verwandte Themen