朱皮特的博客 自由的飞翔

源码Android安卓应用手势锁图案解锁的实现

2017-02-27
朱皮特
阅读量:

交互细节

  • 用户首先使用账号/密码进行登录。
  • 登录成功后,判断是否是第一次登录使用,如果是第一次则显示创建手势密码的界面,要求用户创建手势锁。
  • 创建的过程中要求用户连接至少四个点,并且绘制两次以确认绘制正确并记住绘制的路径。确认成功后进入APP首页。
  • 用户在APP页面使用功能后,把APP退出到后台一定时间(超时),则下次再打开APP时弹出解锁页面,要求用户解锁,解锁成功进入APP页面。
  • APP完全退出,下次重新打开APP使用,如果登录账号有缓存登录有效状态并且未过期,则跳过用户账号登录页面进入手势解锁页面,如果登录状态失效则需要重新输入账号密码登录。
  • 用户连续解锁5次失败则进入账号密码登录页面,如果用户忘记手势密码也可以直接点击“忘记手势密码”通过重新登录账号密码来重新设置手势锁。

源码

源码地址:Android安卓应用手势锁图案解锁的实现源码 - 下载频道 - CSDN.NET

  • 创建手势锁的代码见:CreateGestureActivity
  • 解锁手势的代码见:UnlockGestureActivity
  • 演示账号密码登录的页面:LoginActivity
  • 演示APP的主界面:MainActivity ```
- 用户在APP页面使用功能后,把APP退出到后台一定时间(超时),则下次再打开APP时弹出解锁页面,要求用户解锁,解锁成功进入APP页面。主要在Application中实现,主要代码:

@Override public void onCreate() { super.onCreate();

    countActivedActivity = 0;
    mInstance = this;
    mSP = getSharedPreferences(Constant.CONFIG_NAME, MODE_PRIVATE);
    mLockPatternUtils = new LockPatternUtils(this);

    registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

        }

        @Override
        public void onActivityStarted(Activity activity) {
            if (countActivedActivity == 0 && mBackgroundEver == true) {
                Log.v(TAG, "切到前台  lifecycle");
                timeOutCheck(activity);
            }
            countActivedActivity++;
        }

        @Override
        public void onActivityResumed(Activity activity) {

        }

        @Override
        public void onActivityPaused(Activity activity) {

        }

        @Override
        public void onActivityStopped(Activity activity) {
            countActivedActivity--;
            if (countActivedActivity == 0) {
                Log.v(TAG, "切到后台  lifecycle");
                mBackgroundEver = true;

                if (isAlpSwitchOn() == true) {
                    saveStartTime();
                }
            }
        }

        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

        }

        @Override
        public void onActivityDestroyed(Activity activity) {

        }
    });
}

public void timeOutCheck(Activity activity) {
    long endTime = System.currentTimeMillis();
    if (endTime - getStartTime() >= Constant.TIMEOUT_ALP * 1000) {
        Util.toast(this, "超时了,请重新验证");
        String alp = mSP.getString(Constant.ALP, null);
        if (TextUtils.isEmpty(alp) == false) {
            Intent intent = new Intent(this, UnlockGestureActivity.class);
            intent.putExtra("pattern", alp);
            intent.putExtra("login", false); //手势验证,不进行登录验证
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            // 打开新的Activity
            activity.startActivityForResult(intent, Constant.REQ_COMPARE_PATTERN_TIMEOUT_CHECK);
        }
    }
}

public void saveStartTime() {
    mSP.edit().putLong(Constant.START_TIME, System.currentTimeMillis()).commit();
}

public long getStartTime() {
    long startTime = 0;
    try {
        startTime = mSP.getLong(Constant.START_TIME, 0);
    } catch (Exception e) {
        startTime = 0;
    }
    return startTime;
} ```

效果

  • 账号密码登录页面:

账号密码登录页面

  • 创建手势锁:

创建手势锁

  • 绘制第一遍手势路径:

绘制第一遍手势路径

  • 要求再次绘制解锁图案:

要求再次绘制解锁图案

  • 进入APP主页面:

进入APP主页面

  • 进入手势解锁页面,要求用户解锁:

进入手势解锁页面,要求用户解锁

  • 当用户解锁失败时:

当用户解锁失败时

  • 连续5次解锁失败,要求重新登录:

连续5次解锁失败,要求重新登录

参考


Comments

Content