2013-06-17 2 views
3

기본적으로 앱에서 제스처를 생성하라는 메시지를 표시하고 어딘가에 저장합니다 (문제가있는 곳). 나중에 검색하여 일치시킵니다 당신이 당신의 "암호"로 입력하는 것에 반하는 것입니다. 다음과 같이 동작 생성을위한 제스처 라이브러리에서 제스처 저장 및 검색

, 무슨 내가 가진 것은 :

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) { 
    } 
} 
} 

이 첫 번째 코드입니다, 처음에 제스처를 만들기위한 책임이있는 일. 메모 할 사항 : 레이아웃은 제스처 오버레이, 두 개의 버튼, 하나는 제스처를 재설정하고 다른 하나는 확인 메소드와 연결됩니다.

공용 클래스 GestureConfirm이 활동 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(); 
     } 
    } 
} 
} 

내가 제스처를 읽고에 대한 책임이있는 코드를 가지고있는 것입니다.

+0

무엇이 문제입니까? 귀하의 제스처가 인정되지 않습니까? 왜'GestureLibrary'는 한 점에서'store'이고 다른 점에서는'gestureLib'입니까? 어쨌든, 'store.load()'도 호출 해보십시오. – rciovati

+0

죄송합니다. 여러 코드 샘플을 사용해 내려고했지만, "이 코드를 직접 만들지 않았습니다"아직 변수 이름이 일치하지 않습니다. 그리고 store.load()가 작동합니다! 거의. Android Dev Sample Gesture Builder를 실행하고 해당 디렉토리에 제스처를 저장했습니다. 문제는 인식 코드가 샘플 빌더의 제스처를 인식하지만 내 앱 사용자가 생성 한 것은 인식하지 못한다는 것입니다. 그래서 저장 메커니즘에 여전히 결함이 있습니다. 나는 그것이 무엇이 될 수 있는지 혼란 스럽습니다. – scibor

+0

로직이 나에게 잘 어울립니다. 시도하고있는 전체 코드를 게시 해보십시오. – rciovati

답변

1

코드가 정상적으로 보입니다. save()에 잠시 시간이 걸리므로 새로운 Activity에로드하면 아직 저장되지 않았습니다.

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; 
    } 

} 

을 그리고 당신이에 대한 참조를 먹고 싶어하면 바로 전화 : 당신은 싱글 톤 클래스를 사용하여 해결할 수

GestureLibrary store = PasswordGesturesLibrary.getStore(this); 

당신이 모두 활동에 사용해야합니다.

또한 sms templates with gestures이 CyanogenMod SMS 앱에서 작동하는 방법을 살펴보십시오.

+0

샘플 작성자를 통해 디렉토리에 제스처가 있으면 문제가 메모리에 제스처됩니다. 통역사는 문제를 일으키지 않습니다. – scibor

+0

이 솔루션을 다시 시도해 보니 다른 것들이 바뀌 었습니다. 고마워, 난 잠시 동안이 있었어 – scibor

+0

차갑다. 다행 이네. – rciovati