Quiero crear una aplicación de firma digital en android. Debe capturar la firma del usuario y almacenarla como una imagen. Si alguien sabe, por favor avíseme.firma digital en android
Respuesta
Esto se puede hacer con la ayuda de Gestureoverlay. Esto se demuestra en el APIDemos. En el siguiente enlace debe ser útil:
Pruebe una vista personalizada en lugar de gestos:
package com.example.myapp.gui.views;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* A simple view to capture a path traced onto the screen. Initially intended to be used to captures signatures.
*
* @author Andrew Crichton
* @version 0.1
*/
public class SignatureView extends View {
private Path mPath;
private Paint mPaint;
private Paint bgPaint = new Paint(Color.TRANSPARENT);
private Bitmap mBitmap;
private Canvas mCanvas;
private float curX, curY;
private static final int TOUCH_TOLERANCE = 4;
private static final int STROKE_WIDTH = 4;
public SignatureView(Context context) {
super(context);
init();
}
public SignatureView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SignatureView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
setFocusable(true);
mPath = new Path();
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(STROKE_WIDTH);
}
public void setSigColor(int color) {
mPaint.setColor(color);
}
public void setSigColor(int a, int red, int green, int blue) {
mPaint.setARGB(a, red, green, blue);
}
public boolean clearSignature() {
if (mBitmap != null)
createFakeMotionEvents();
if (mCanvas != null) {
mCanvas.drawColor(Color.BLACK);
mCanvas.drawPaint(bgPaint);
mPath.reset();
invalidate();
}
else {
return false;
}
return true;
}
public Bitmap getImage() {
return this.mBitmap;
}
public void setImage(Bitmap bitmap) {
this.mBitmap = bitmap;
this.invalidate();
}
@Override
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
int bitmapWidth = mBitmap != null ? mBitmap.getWidth() : 0;
int bitmapHeight = mBitmap != null ? mBitmap.getWidth() : 0;
if (bitmapWidth >= width && bitmapHeight >= height)
return;
if (bitmapWidth < width)
bitmapWidth = width;
if (bitmapHeight < height)
bitmapHeight = height;
Bitmap newBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
Canvas newCanvas = new Canvas();
newCanvas.setBitmap(newBitmap);
if (mBitmap != null)
newCanvas.drawBitmap(mBitmap, 0, 0, null);
mBitmap = newBitmap;
mCanvas = newCanvas;
}
private void createFakeMotionEvents() {
MotionEvent downEvent = MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis()+100, MotionEvent.ACTION_DOWN, 1f, 1f ,0);
MotionEvent upEvent = MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis()+100, MotionEvent.ACTION_UP, 1f, 1f ,0);
onTouchEvent(downEvent);
onTouchEvent(upEvent);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(mBitmap, 0, 0, mPaint);
canvas.drawPath(mPath, mPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touchDown(x, y);
break;
case MotionEvent.ACTION_MOVE:
touchMove(x, y);
break;
case MotionEvent.ACTION_UP:
touchUp();
break;
}
invalidate();
return true;
}
/**----------------------------------------------------------
* Private methods
**---------------------------------------------------------*/
private void touchDown(float x, float y) {
mPath.reset();
mPath.moveTo(x, y);
curX = x;
curY = y;
}
private void touchMove(float x, float y) {
float dx = Math.abs(x - curX);
float dy = Math.abs(y - curY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mPath.quadTo(curX, curY, (x + curX)/2, (y + curY)/2);
curX = x;
curY = y;
}
}
private void touchUp() {
mPath.lineTo(curX, curY);
if (mCanvas == null) {
mCanvas = new Canvas();
mCanvas.setBitmap(mBitmap);
}
mCanvas.drawPath(mPath, mPaint);
mPath.reset();
}
}
A continuación, utilice esta clase en el código XML: <com.example.myapp.gui.views.SignatureView .../>
Para obtener la firma dibujada, utilizar este : Bitmap bmp = ((SignatureView)findViewById(R.id.signatureview)).getImage();
Eventualmente se puede guardar el mapa de bits con este código:
public void saveBitmap(Bitmap bmp) {
try {
String root = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
String filepath = root + "signature.jpg";
FileOutputStream fos = new FileOutputStream(filepath);
bmp.compress(CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
}
catch(Exception e) {
Log.e("Could not save", e.getMessage());
e.printStackTrace();
}
}
que guardará la firma en la raíz de su tarjeta sd como signature.jpeg. Para la parte de escritura, asegúrese de tener ese permiso en su manifiesto: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
.. ¡Muchísimas gracias! pero cuando dibujo una línea o cualquier forma ¿por qué cambia su ubicación? por favor, ¿puedes ayudar en esto? – Rauf
@Rauf ¿te refieres a cuando dibujas, Android dibuja algunos (decenas) de píxeles al lado de donde estás dibujando? – stealthjong
no..I delineo la línea desde el punto A (200,200) hasta B (200,400) y luego cuando suelto el puntero/línea táctil se desplaza al lado superior izquierdo como X (50,50) a Z (50,250) .. intenté hacerlo lo mejor posible para explicar esto :) – Rauf
esperanza este código le ayuda :)
esign_main.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" >
<android.gesture.GestureOverlayView
android:id="@+id/signaturePad"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="5"
android:background="@android:color/white"
android:clickable="false"
android:eventsInterceptionEnabled="true"
android:fadeEnabled="false"
android:gestureColor="#0000ff"
android:gestureStrokeLengthThreshold="0.1"
android:gestureStrokeType="multiple"
android:longClickable="false"
android:orientation="vertical"
android:uncertainGestureColor="#000000"
android:splitMotionEvents="true"
android:fadeOffset="10000000">
</android.gesture.GestureOverlayView>
<RelativeLayout
android:id="@+id/rellay_esign_donebutton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dp"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
>
<Button
android:id="@+id/DoneButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Done" />
<Button
android:id="@+id/ClearButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Clear" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
Esignature.java
public class Esignature extends Activity {
GestureOverlayView gestureView;
String path;
File file;
Bitmap bitmap;
public boolean gestureTouch=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.esign_main);
Button donebutton = (Button) findViewById(R.id.DoneButton);
donebutton.setText("Done");
Button clearButton = (Button) findViewById(R.id.ClearButton);
clearButton.setText("Clear");
path=Environment.getExternalStorageDirectory()+"/signature.png";
file = new File(path);
file.delete();
gestureView = (GestureOverlayView) findViewById(R.id.signaturePad);
gestureView.setDrawingCacheEnabled(true);
gestureView.setAlwaysDrawnWithCacheEnabled(true);
gestureView.setHapticFeedbackEnabled(false);
gestureView.cancelLongPress();
gestureView.cancelClearAnimation();
gestureView.addOnGestureListener(new OnGestureListener() {
@Override
public void onGesture(GestureOverlayView arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
}
@Override
public void onGestureCancelled(GestureOverlayView arg0,
MotionEvent arg1) {
// TODO Auto-generated method stub
}
@Override
public void onGestureEnded(GestureOverlayView arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
}
@Override
public void onGestureStarted(GestureOverlayView arg0,
MotionEvent arg1) {
// TODO Auto-generated method stub
if (arg1.getAction()==MotionEvent.ACTION_MOVE){
gestureTouch=false;
}
else
{
gestureTouch=true;
}
}});
donebutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
bitmap = Bitmap.createBitmap(gestureView.getDrawingCache());
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
fos = new FileOutputStream(file);
// compress to specified format (PNG), quality - which is
// ignored for PNG, and out stream
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
if(gestureTouch==false)
{
setResult(0);
finish();
}
else
{
setResult(1);
finish();
}
}
});
clearButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
gestureView.invalidate();
gestureView.clear(true);
gestureView.clearAnimation();
gestureView.cancelClearAnimation();
}
});
}
}
Para un archivo jpg con fondo blanco:
gestureView.setDrawingCacheBackgroundColor(Color.WHITE);
y
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
usando solución de Harshal Benake.
- 1. Generar PDF con firma digital
- 2. Firma digital para mensaje SOAP en WCF
- 3. Correo electrónico de firma digital en Ruby con S/MIME
- 4. Insertar firma digital en el archivo pdf existente
- 5. ¿Cómo agregar imagen de firma digital a PDF en iOS?
- 6. ¿cuál es la diferencia entre la firma digital y el certificado digital?
- 7. ¿se puede copiar la firma del certificado digital? (ssl)
- 8. ¿Puedo eliminar una firma digital de una DLL?
- 9. cómo comprobar si un archivo tiene una firma digital
- 10. ¿Cómo hacer una firma digital en una aplicación web (JavaScript) usando una tarjeta inteligente?
- 11. Plataforma de Firma es lento en android
- 12. XML Digital Signature Java
- 13. ¿Cómo leo la información de firma digital de un ensamblado .Net firmado?
- 14. X509: Cuál es la diferencia entre firma digital y no repudio
- 15. OpenCV/SURF ¿Cómo generar una imagen hash/huella digital/firma fuera de los descriptores?
- 16. Firma digital: código de muestra para verificación y para extraer información de certificación
- 17. Verifica si un ejecutable dado tiene firma digital y es válido?
- 18. Especificación de referencia URI de #Body mientras que la firma digital de solicitud SOAP - utilizando WCF
- 19. ¿Cómo agregar una firma digital (RSA, Certificado, etc.) a cualquier archivo, usando PHP?
- 20. Firma de .NET Assemblies
- 21. Obtener huella digital del certificado de la aplicación de Android
- 22. captura de firma para android usando phonegap
- 23. Huella digital de video digital de código abierto
- 24. Implementar seguridad de nivel de firma en servicios de Android con más de una firma permitida
- 25. Beginner Digital Synth
- 26. ¿Puedo crear mi propio certificado digital en C# o Windows?
- 27. Verificar SHA1withRSA firma generada en Java (Android) con phpseclib
- 28. Recuperar la firma apk en tiempo de ejecución para Android
- 29. Cómo convertir voz humana en formato digital?
- 30. Firma en UIView
Agregué un código, ahora cubrirá todo su problema. Marque como respuesta cuando funciona. – stealthjong