Android手勢密碼--設置和校驗

来源:https://www.cnblogs.com/ganchuanpu/archive/2018/05/07/9005877.html
-Advertisement-
Play Games

GestureEditActivity: 1 import android.app.Activity; 2 import android.content.Context; 3 import android.content.SharedPreferences; 4 import android.os. ...


 1 private void setGesturePassword() {
 2     toggleMore.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
 3         @Override
 4         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 5             if (isChecked) {
 6 //                    UIUtils.toast("開啟了手勢密碼", false);
 7 //                    sp.edit().putBoolean("isOpen", true).commit();
 8                 String inputCode = sp.getString("inputCode", "");
 9                 if (TextUtils.isEmpty(inputCode)) {//之前沒有設置過
10                     new AlertDialog.Builder(MoreFragment.this.getActivity())
11                             .setTitle("設置手勢密碼")
12                             .setMessage("是否現在設置手勢密碼")
13                             .setPositiveButton("確定", new DialogInterface.OnClickListener() {
14                                 @Override
15                                 public void onClick(DialogInterface dialog, int which) {
16                                     UIUtils.toast("現在設置手勢密碼", false);
17                                     sp.edit().putBoolean("isOpen", true).commit();
18 //                                            toggleMore.setChecked(true);
19                                     //開啟新的activity:
20                                     ((BaseActivity) MoreFragment.this.getActivity()).goToActivity(GestureEditActivity.class, null);
21                                 }
22                             })
23                             .setNegativeButton("取消", new DialogInterface.OnClickListener() {
24                                 @Override
25                                 public void onClick(DialogInterface dialog, int which) {
26                                     UIUtils.toast("取消了現在設置手勢密碼", false);
27                                     sp.edit().putBoolean("isOpen", false).commit();
28                                     toggleMore.setChecked(false);
29 
30                                 }
31                             })
32                             .show();
33                 } else {
34                     UIUtils.toast("開啟手勢密碼", false);
35                     sp.edit().putBoolean("isOpen", true).commit();
36 //                        toggleMore.setChecked(true);
37                 }
38             } else {
39                 UIUtils.toast("關閉了手勢密碼", false);
40                 sp.edit().putBoolean("isOpen", false).commit();
41 //                    toggleMore.setChecked(false);
42 
43             }
44         }
45     });
46 }
47 
48 private void resetGesture() {
49     tvMoreReset.setOnClickListener(new View.OnClickListener() {
50         @Override
51         public void onClick(View v) {
52             boolean checked = toggleMore.isChecked();
53             if (checked) {
54                 ((BaseActivity) MoreFragment.this.getActivity()).goToActivity(GestureEditActivity.class, null);
55             } else {
56                 UIUtils.toast("手勢密碼操作已關閉,請開啟後再設置", false);
57             }
58         }
59     });
60 }

GestureEditActivity:

  1 import android.app.Activity;
  2 import android.content.Context;
  3 import android.content.SharedPreferences;
  4 import android.os.Bundle;
  5 import android.text.Html;
  6 import android.text.TextUtils;
  7 import android.util.Log;
  8 import android.view.View;
  9 import android.view.animation.Animation;
 10 import android.view.animation.AnimationUtils;
 11 import android.widget.FrameLayout;
 12 import android.widget.TextView;
 13 import android.widget.Toast;
 14 
 15 import com.atguigu.gesturelock.widget.GestureContentView;
 16 import com.atguigu.gesturelock.widget.GestureDrawline;
 17 import com.atguigu.gesturelock.widget.LockIndicator;
 18 import com.atguigu.p2pinvest0828.R;
 19 
 20 public class GestureEditActivity extends Activity implements View.OnClickListener {
 21     /**
 22      * 手機號碼
 23      */
 24     public static final String PARAM_PHONE_NUMBER = "PARAM_PHONE_NUMBER";
 25     /**
 26      * 意圖
 27      */
 28     public static final String PARAM_INTENT_CODE = "PARAM_INTENT_CODE";
 29     /**
 30      * 首次提示繪製手勢密碼,可以選擇跳過
 31      */
 32     public static final String PARAM_IS_FIRST_ADVICE = "PARAM_IS_FIRST_ADVICE";
 33     private TextView mTextTitle;
 34     private TextView mTextCancel;
 35     private LockIndicator mLockIndicator;
 36     private TextView mTextTip;
 37     private FrameLayout mGestureContainer;
 38     private GestureContentView mGestureContentView;
 39     private TextView mTextReset;
 40     private String mParamSetUpcode = null;
 41     private String mParamPhoneNumber;
 42     private boolean mIsFirstInput = true;
 43     private String mFirstPassword = null;
 44     private String mConfirmPassword = null;
 45     private int mParamIntentCode;
 46 
 47     private SharedPreferences mSharedPreferences = null;
 48 
 49     @Override
 50     public void onCreate(Bundle savedInstanceState) {
 51         super.onCreate(savedInstanceState);
 52         setContentView(R.layout.activity_gesture_edit);
 53         setUpViews();
 54         setUpListeners();
 55     }
 56 
 57     private void setUpViews() {
 58         mTextTitle = (TextView) findViewById(R.id.text_title);
 59         mTextCancel = (TextView) findViewById(R.id.text_cancel);
 60         mTextReset = (TextView) findViewById(R.id.text_reset);
 61         mTextReset.setClickable(false);
 62         mLockIndicator = (LockIndicator) findViewById(R.id.lock_indicator);
 63         mTextTip = (TextView) findViewById(R.id.text_tip);
 64         mGestureContainer = (FrameLayout) findViewById(R.id.gesture_container);
 65         mSharedPreferences = this.getSharedPreferences("secret_protect", Context.MODE_PRIVATE);
 66         // 初始化一個顯示各個點的viewGroup
 67         mGestureContentView = new GestureContentView(this, false, "", new GestureDrawline.GestureCallBack() {
 68             @Override
 69             public void onGestureCodeInput(String inputCode) {
 70 
 71                 if (!isInputPassValidate(inputCode)) {
 72                     mTextTip.setText(Html.fromHtml("<font color='#c70c1e'>最少鏈接4個點, 請重新輸入</font>"));
 73                     mGestureContentView.clearDrawlineState(0L);
 74 
 75                     return;
 76                 }
 77 
 78                 if (mIsFirstInput) {
 79                     mFirstPassword = inputCode;
 80 
 81                     updateCodeList(inputCode);
 82 
 83                     mGestureContentView.clearDrawlineState(0L);
 84                     mTextReset.setClickable(true);
 85                     mTextReset.setText(getString(R.string.reset_gesture_code));
 86                 } else {
 87 
 88                     if (inputCode.equals(mFirstPassword)) {
 89 
 90                         Toast.makeText(GestureEditActivity.this, "設置成功", Toast.LENGTH_SHORT).show();
 91                         mGestureContentView.clearDrawlineState(0L);
 92                         GestureEditActivity.this.finish();
 93                     } else {
 94                         mTextTip.setText(Html.fromHtml("<font color='#c70c1e'>與上一次繪製不一致,請重新繪製</font>"));
 95 
 96                         // 左右移動動畫
 97                         Animation shakeAnimation = AnimationUtils.loadAnimation(GestureEditActivity.this, R.anim.shake);
 98                         mTextTip.startAnimation(shakeAnimation);
 99 
100                         // 保持繪製的線,1.5秒後清除
101                         mGestureContentView.clearDrawlineState(1300L);
102                     }
103                 }
104 
105                 mIsFirstInput = false;
106             }
107 
108             @Override
109             public void checkedSuccess() {
110 
111             }
112 
113             @Override
114             public void checkedFail() {
115 
116             }
117         });
118 
119         // 設置手勢解鎖顯示到哪個佈局裡面
120         mGestureContentView.setParentView(mGestureContainer);
121 
122         updateCodeList("");
123     }
124 
125     private void setUpListeners() {
126         mTextCancel.setOnClickListener(this);
127         mTextReset.setOnClickListener(this);
128     }
129 
130     private void updateCodeList(String inputCode) {
131 
132         // 更新選擇的圖案
133         mLockIndicator.setPath(inputCode);
134         mSharedPreferences.edit().putString("inputCode",inputCode).commit();
135         Log.e("TAG", "inputCode = " + inputCode);
136     }
137 
138     @Override
139     public void onClick(View v) {
140 
141         switch (v.getId()) {
142             case R.id.text_cancel:
143                 this.finish();
144                 break;
145 
146             case R.id.text_reset:
147                 mIsFirstInput = true;
148                 updateCodeList("");
149                 mTextTip.setText(getString(R.string.set_gesture_pattern));
150                 break;
151 
152 
153             default:
154                 break;
155         }
156     }
157 
158     private boolean isInputPassValidate(String inputPassword) {
159 
160         if (TextUtils.isEmpty(inputPassword) || inputPassword.length() < 4) {
161             return false;
162         }
163 
164         return true;
165     }
166 }
View Code

 

我的界面中:

//判斷一下,是否開啟了手勢密碼。如果開啟:先輸入手勢密碼
SharedPreferences sp = this.getActivity().getSharedPreferences("secret_protect", Context.MODE_PRIVATE);
boolean isOpen = sp.getBoolean("isOpen", false);
if(isOpen){
    ((BaseActivity)this.getActivity()).goToActivity(GestureVerifyActivity.class,null);
    return;
}

GestureVerifyActivity:

  1 import android.app.Activity;
  2 import android.content.Context;
  3 import android.content.SharedPreferences;
  4 import android.os.Bundle;
  5 import android.text.Html;
  6 import android.text.TextUtils;
  7 import android.view.View;
  8 import android.view.animation.Animation;
  9 import android.view.animation.AnimationUtils;
 10 import android.widget.FrameLayout;
 11 import android.widget.ImageView;
 12 import android.widget.RelativeLayout;
 13 import android.widget.TextView;
 14 import android.widget.Toast;
 15 
 16 import com.atguigu.gesturelock.widget.GestureContentView;
 17 import com.atguigu.gesturelock.widget.GestureDrawline;
 18 import com.atguigu.p2pinvest0828.R;
 19 
 20 public class GestureVerifyActivity extends Activity implements View.OnClickListener {
 21     /** 手機號碼*/
 22     public static final String PARAM_PHONE_NUMBER = "PARAM_PHONE_NUMBER";
 23     /** 意圖 */
 24     public static final String PARAM_INTENT_CODE = "PARAM_INTENT_CODE";
 25     private RelativeLayout mTopLayout;
 26     private TextView mTextTitle;
 27     private TextView mTextCancel;
 28     private ImageView mImgUserLogo;
 29     private TextView mTextPhoneNumber;
 30     private TextView mTextTip;
 31     private FrameLayout mGestureContainer;
 32     private GestureContentView mGestureContentView;
 33     private TextView mTextForget;
 34     private TextView mTextOther;
 35     private String mParamPhoneNumber;
 36     private long mExitTime = 0;
 37     private int mParamIntentCode;
 38     private SharedPreferences mSharedPreferences;
 39 
 40     @Override
 41     public void onCreate(Bundle savedInstanceState) {
 42         super.onCreate(savedInstanceState);
 43 
 44         setContentView(R.layout.activity_gesture_verify);
 45 
 46         ObtainExtraData();
 47 
 48         setUpViews();
 49 
 50         setUpListeners();
 51     }
 52 
 53     private void ObtainExtraData() {
 54         mParamPhoneNumber = getIntent().getStringExtra(PARAM_PHONE_NUMBER);
 55         mParamIntentCode = getIntent().getIntExtra(PARAM_INTENT_CODE, 0);
 56         mSharedPreferences = this.getSharedPreferences("secret_protect", Context.MODE_PRIVATE);
 57     }
 58 
 59     private void setUpViews() {
 60         mTopLayout = (RelativeLayout) findViewById(R.id.top_layout);
 61         mTextTitle = (TextView) findViewById(R.id.text_title);
 62         mTextCancel = (TextView) findViewById(R.id.text_cancel);
 63         mImgUserLogo = (ImageView) findViewById(R.id.user_logo);
 64         mTextPhoneNumber = (TextView) findViewById(R.id.text_phone_number);
 65         mTextTip = (TextView) findViewById(R.id.text_tip);
 66         mGestureContainer = (FrameLayout) findViewById(R.id.gesture_container);
 67         mTextForget = (TextView) findViewById(R.id.text_forget_gesture);
 68         mTextOther = (TextView) findViewById(R.id.text_other_account);
 69 
 70         String inputCode = mSharedPreferences.getString("inputCode","1235789");
 71         // 初始化一個顯示各個點的viewGroup
 72         mGestureContentView = new GestureContentView(this, true, inputCode,
 73                 new GestureDrawline.GestureCallBack() {
 74 
 75                     @Override
 76                     public void onGestureCodeInput(String inputCode) {
 77 
 78                     }
 79 
 80                     @Override
 81                     public void checkedSuccess() {
 82 
 83                         mGestureContentView.clearDrawlineState(0L);
 84 
 85                         Toast.makeText(GestureVerifyActivity.this, "密碼正確", Toast.LENGTH_SHORT).show();
 86 
 87                         GestureVerifyActivity.this.finish();
 88                     }
 89 
 90                     @Override
 91                     public void checkedFail() {
 92 
 93                         mGestureContentView.clearDrawlineState(1300L);
 94                         mTextTip.setVisibility(View.VISIBLE);
 95                         mTextTip.setText(Html.fromHtml("<font color='#c70c1e'>密碼錯誤</font>"));
 96 
 97                         // 左右移動動畫
 98                         Animation shakeAnimation = AnimationUtils.loadAnimation(GestureVerifyActivity.this, R.anim.shake);
 99                         mTextTip.startAnimation(shakeAnimation);
100                     }
101                 });
102 
103         // 設置手勢解鎖顯示到哪個佈局裡面
104         mGestureContentView.setParentView(mGestureContainer);
105     }
106 
107     private void setUpListeners() {
108         mTextCancel.setOnClickListener(this);
109         mTextForget.setOnClickListener(this);
110         mTextOther.setOnClickListener(this);
111     }
112 
113     private String getProtectedMobile(String phoneNumber) {
114 
115         if (TextUtils.isEmpty(phoneNumber) || phoneNumber.length() < 11) {
116             return "";
117         }
118 
119         StringBuilder builder = new StringBuilder();
120         builder.append(phoneNumber.subSequence(0,3));
121         builder.append("****");
122         builder.append(phoneNumber.subSequence(7,11));
123 
124         return builder.toString();
125     }
126 
127 
128 
129     @Override
130     public void onClick(View v) {
131 
132         switch (v.getId()) {
133             case R.id.text_cancel:
134                 this.finish();
135                 break;
136 
137             default:
138                 break;
139         }
140     }
141 }
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MySQL元數據 Meta Data,一般是結構化數據(如存儲在資料庫里的數據,欄位長度、類型、預設值等等)。Meta Data就是描述數據的數據,在MySQL中描述有哪些資料庫、哪些表、表有多少欄位、類型。 MySQL元數據信息 查詢結果信息,SELECT、UPDATE或DELETE語句影響的行數 ...
  • 當實際項目上線到生產環境中,難以避免一些意外情況,如數據丟失、伺服器停機等。對於系統的搜索服務來說,當遇到停機的情況意味著在停機這段時間內,用戶都不能通過搜索的相關功能進行訪問數據,停機意味著將這一段時間內的數據服務完全停止。如果項目是互聯網項目依賴於用戶數量,這將嚴重影響用戶訪問和用戶的產品體驗。 ...
  • 本文主要總結並記錄一下簡單且常用的mysql 在cmd 視窗中操作的基本命令 命令停止mysql 資料庫服務 1.(cmd)命令行 2.手動: 1. 使用快捷鍵 ctr+alt+delete =》2. 啟動任務管理器=》3. 進入服務 =》4.找到mysql 將其啟動/關閉 3.登錄/退出mysql ...
  • 設計模式六大基本原則 1.單一職責原則 英文:Single Responsibility Principles,縮寫SRP 定義:就一個類而言,應該僅有一個引起它變化的原因。 理解:例如兩個完全不一樣的功能就不應該放在一個類中。一個類總應該是一組相關性很高的函數,數據的封裝。 對應一個類,不求功能面 ...
  • 最近用到JS和OC原生方法調用的問題,查了許多資料都語焉不詳,自己記錄一下吧,如果有誤歡迎聯繫我指出。 JS中調用OC方法有三種方式: 先上OC代碼 // 設置javaScriptContext上下文 self.jsContext = [self.webView valueForKeyPath:@" ...
  • 最近項目測試出一個隱藏已久的bug,經過多番測試,發現在iOS9下自定義的一個UICollectionViewCell只走一次awakeFromNib。 具體情況是,項目中有一個控制器用到了自定義的UICollectionView,有四組數據,然而有三組自定義的UICollectionViewCel ...
  • as clean項目之後有時候會報錯。 可以找得到目錄刪掉,然後重啟as,但是下次clean可能又會報類似的錯誤。 解決方法如下: 進入File-Setting-Build,Execution,Deployment-Instant Run 取消勾選 Restart activity on code ...
  • UpdateInfo WelcomeActivity: ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...