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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...