2013-06-17 2 views
3

J'écris une chose de type protection par mot de passe où, fondamentalement, l'application vous invite à créer un geste, le stocke quelque part (c'est là que se trouve le problème) et le récupère plus tard. contre ce que vous entrez comme votre "mot de passe".Enregistrer et récupérer des gestes dans la bibliothèque de gestes

Pour la création de geste, ce que j'ai est la suivante:

public class GestureUnlock extends Activity { 
private static final float LENGTH_THRESHOLD = 120.0f; 
private Gesture mGesture; 
private View mConfirmButton; 
private final File mStoreFile = new File(Environment.getExternalStorageDirectory(), "gestures"); 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.gesture_unlock); 

    mConfirmButton = findViewById(R.id.confirmButton); 

    GestureOverlayView overlay = (GestureOverlayView)findViewById(R.id.gestureOverlayView); 
    overlay.addOnGestureListener(new GesturesProcessor()); 
} 

protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    if (mGesture != null) { 
     outState.putParcelable("gesture", mGesture); 
    } 
} 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 

    mGesture = savedInstanceState.getParcelable("gesture"); 
    if (mGesture != null) { 
     final GestureOverlayView overlay = 
       (GestureOverlayView) findViewById(R.id.gestureOverlayView); 
     overlay.post(new Runnable() { 
      public void run() { 
       overlay.setGesture(mGesture); 
      } 
     }); 
     mConfirmButton.setEnabled(true); 
    } 
} 

public void confirm(View v) { 
    if (mGesture != null) { 

     GestureLibrary store = GestureLibraries.fromFile(mStoreFile); 
     store.addGesture("Gesture Password", mGesture); 
     store.save(); 

     setResult(RESULT_OK); 

     Intent intent = new Intent(this, GestureConfirm.class); 
     startActivity(intent); 

    } else { 
     setResult(RESULT_CANCELED); 
    } 
} 

public void clear(View v) { 
    GestureOverlayView overlay = (GestureOverlayView)findViewById(R.id.gestureOverlayView); 
    overlay.cancelClearAnimation(); 
    overlay.clear(true); 
} 

private class GesturesProcessor implements GestureOverlayView.OnGestureListener { 
    public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) { 
     mConfirmButton.setEnabled(false); 
     mGesture = null; 
    } 
    public void onGesture(GestureOverlayView overlay, MotionEvent event) { 
    } 

    public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) { 
     mGesture = overlay.getGesture(); 
     if (mGesture.getLength() < LENGTH_THRESHOLD) { 
      overlay.clear(false); 
     } 
     mConfirmButton.setEnabled(true); 
    } 
    public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) { 
    } 
} 
} 

C'est le premier code, le responsable de la création du geste en premier lieu. Choses à noter: la mise en page est une superposition de gestes, deux boutons, l'un réinitialise le geste, l'autre est associé à la méthode de confirmation.

GestureConfirm public class étend l'activité met en œuvre OnGesturePerformedListener {

private final File mStoreFile = new File(Environment.getExternalStorageDirectory(), "gestures"); 
private GestureLibrary store = GestureLibraries.fromFile(mStoreFile); 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.gesture_confirm); 

    GestureOverlayView gesturesView = (GestureOverlayView) findViewById(R.id.gestureOverlayViewConfirm); 
    gesturesView.addOnGesturePerformedListener(this); 
    store.load(); 

} 

public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { 
    ArrayList<Prediction> predictions = store.recognize(gesture); 
    for (Prediction prediction : predictions) { 
     if (prediction.score > 1.0) { 
      Toast.makeText(this, prediction.name, Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 
} 

Voici ce que j'ai le code responsable de la lecture des gestes.

+0

Quel est le problème? Votre geste n'est pas reconnu? Pourquoi 'GestureLibrary' est' store' dans un point et 'gestureLib' dans un autre? Quoi qu'il en soit, essayez aussi d'appeler 'store.load()' – rciovati

+0

Désolé, j'ai essayé différents exemples de code pour le faire descendre, je n'ai pas encore "fait ce code" donc il y a des incohérences de noms de variables. Et le store.load() fonctionne! Genre de. J'ai couru l'Android Dev Sample Gesture Builder et stocké un geste dans ce répertoire; le fait est que le code de reconnaissance reconnaît les gestes du générateur d'échantillons mais pas celui que mon utilisateur a créé; donc il y a encore un problème avec le mécanisme de stockage et je suis confus par ce que cela pourrait être – scibor

+0

La logique semble bonne pour moi. Essayez de poster le code complet de votre essai. – rciovati

Répondre

1

Votre code semble correct. Je ai peur save() prend un certain temps et quand vous le charger dans le nouveau Activity il n'a pas encore enregistré. Vous pouvez résoudre en utilisant une classe singleton:

import java.io.File; 

import android.content.Context; 
import android.gesture.GestureLibraries; 
import android.gesture.GestureLibrary; 

public class PasswordGesturesLibrary { 

    private static GestureLibrary sStore; 

    public static GestureLibrary getStore(Context c) { 

     if (sStore == null) { 
      File storeFile = new File(c.getFilesDir(), "gestures"); 
      sStore = GestureLibraries.fromFile(storeFile); 
      sStore.load(); 
     } 

     return sStore; 
    } 

} 

Et quand vous voulez prendre une référence à ce qui vient appeler:

GestureLibrary store = PasswordGesturesLibrary.getStore(this); 

Assurez-vous de l'utiliser dans les deux activités.

En outre, jetez un oeil à la façon dont fonctionne sms templates with gestures dans l'application SMS CyanogenMod.

+0

Toujours pas bon, le problème est définitivement de commettre le geste de mémoire, si des gestes existent dans ce répertoire via le générateur d'échantillons, l'interpréteur n'a aucun problème à les faire ressortir. – scibor

+0

J'ai encore essayé cette solution en changeant d'autres choses et ça a marché! Merci beaucoup, j'ai été à cela pendant un certain temps – scibor

+0

Cool. Content que tu aies résolu. – rciovati