編輯:關於Android編程
本文屬於學習分享,如有雷同純屬巧合
怎麼會有雷同呢?
本著技術分享,學習互助的原則,我在此分享一款已經開源的android 圖案解鎖的實現。
它也是參考了android自帶的圖案鎖的源碼而修改的,可以作為app來調用。
先看看實現效果吧!

開始說說這個demo的結構吧,首先下載源碼,把android-lockpattern作為lib來使用

1.創建demo,先把haibison.android.lockpattern.LockPatternActivity.java拷到我們的項目裡,他就是圖案的activity,我們可以自己在裡面改邏輯;然後配置AndroidManifest.xml,加上如下的配置
/**
* demo主界面(習慣)
* @author jan
*/
public class MainActivity extends Activity implements OnClickListener {
private static final String TAG = MainActivity;
//請求創建一個新的圖案
private static final int REQ_CREATE_PATTERN = 1;
//比較已有的圖案
private static final int REQ_COMPARE_PATTERN = 2;
//生成隨機的圖案(個人感覺沒啥用(#--)/ .)
private static final int REQ_VERIFY_PATTERN = 3;
//對比測試的密文,代表一個pattern
private String testChars = 101b2a675e9fb9546336d5b9ef70418b594184f4;
private Button openLockPatternBtn,compareButton,verifyModeButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//lockpattern會使用Sharepreference自動保存密文
AlpSettings.Security.setAutoSavePattern(this, true);
//隱身模式:不顯示勾畫的連接線,默認關閉
AlpSettings.Display.setStealthMode(this, false);
//啟用自定義的解析方式 默認使用SHA1算法摘要
//
//
//
// AlpSettings.Security.setEncrypterClass(this, LPEncrypter.class);
openLockPatternBtn = (Button) findViewById(R.id.open_button);
openLockPatternBtn.setOnClickListener(this);
compareButton = (Button) findViewById(R.id.compare_button);
compareButton.setOnClickListener(this);
verifyModeButton = (Button) findViewById(R.id.verify_button);
verifyModeButton.setOnClickListener(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQ_CREATE_PATTERN:
if (resultCode == RESULT_OK) {
char[] pattern = data.getCharArrayExtra(LockPatternActivity.EXTRA_PATTERN);
StringBuffer buffer = new StringBuffer();
for(char c:pattern){
buffer.append(c);
}
Log.i(TAG, result=>+buffer.toString());
Toast.makeText(this, 消息摘要:+buffer, Toast.LENGTH_SHORT).show();
//test:101b2a675e9fb9546336d5b9ef70418b594184f4
}
break;
case REQ_COMPARE_PATTERN:
/*
* 注意!有四種可能出現情況的返回結果
*/
switch (resultCode) {
case RESULT_OK:
//用戶通過驗證
Log.d(TAG, user passed);
break;
case RESULT_CANCELED:
// 用戶取消
Log.d(TAG, user cancelled);
break;
case LockPatternActivity.RESULT_FAILED:
//用戶多次失敗
Log.d(TAG, user failed);
break;
case LockPatternActivity.RESULT_FORGOT_PATTERN:
// The user forgot the pattern and invoked your recovery Activity.
Log.d(TAG, user forgot);
break;
}
/*
* 在任何情況下,EXTRA_RETRY_COUNT都代表著用戶嘗試的圖案的次數
*/
int retryCount = data.getIntExtra(
LockPatternActivity.EXTRA_RETRY_COUNT, 0);
Log.i(TAG, 用戶嘗試了+retryCount+次數);
break;
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
//打開一個新的圖案
case R.id.open_button:
Intent intent = new Intent(
LockPatternActivity.ACTION_CREATE_PATTERN, null, this,
LockPatternActivity.class);
startActivityForResult(intent, REQ_CREATE_PATTERN);
break;
//對指定保存的圖案做比較
case R.id.compare_button:
char[] savedPattern = testChars.toCharArray();
Intent compare = new Intent(LockPatternActivity.ACTION_COMPARE_PATTERN, null,
this, LockPatternActivity.class);
compare.putExtra(LockPatternActivity.EXTRA_PATTERN, savedPattern);
startActivityForResult(compare, REQ_COMPARE_PATTERN);
break;
//隨機圖案
case R.id.verify_button:
//設置驗證的顯示次數,默認是4次
AlpSettings.Display.setCaptchaWiredDots(this, 9);
Intent verifyIntent = new Intent(LockPatternActivity.ACTION_VERIFY_CAPTCHA, null,
this, LockPatternActivity.class);
startActivityForResult(verifyIntent, REQ_VERIFY_PATTERN);
break;
}
}
}
3.對於圖案鎖的默認加密方式是SHA1(Secure Hash Algorithm),傳說中的安全哈希算法,感覺和MD5差不多,如果你需要自己實現自己的加解密方式,只要實現haibison.android.lockpattern.util.IEncrypter這個接口,然後設置一下:AlpSettings.Security.setEncrypterClass(this, LPEncrypter.class);
/**
* 可提供自定義的加密碼方式
*/
public class LPEncrypter implements IEncrypter {
@Override
public char[] encrypt(Context context, List pattern) {
//這只是一個簡單的demo,用了很二的加密方式,參考而已。
StringBuilder result = new StringBuilder();
for (Cell cell : pattern)
result.append(Integer.toString(cell.getId() + 1)).append('-');
return result.substring(0, result.length() - 1).toCharArray();
}
@Override
public List decrypt(Context context, char[] encryptedPattern) {
List| result = Lists.newArrayList();
String[] ids = new String(encryptedPattern).split([^0-9]);
for (String id : ids)
result.add(Cell.of(Integer.parseInt(id) - 1));
return result;
}
} | | |
基於Ionic+Cordova+Bmob的開源項目實戰
一、需求分析“位置分享”App正如其名稱所述那樣,是一款可以分享自己地理位置的應用。“位置分享”App的功能需求大致如下:
手機qq怎麼截圖 手機qq浏覽器怎麼截圖
手機qq可以截圖嗎?有時候想把與某人的聊天記錄截屏保存,或者想在qq浏覽器上保存重要的信息,該怎麼操作呢?下面就隨小編把這項技能gei起來!手機qq怎麼截圖
自定義控件_day01
簡介: 在自定義view的時候,其實很簡單,只需要知道3步驟: 1.測量——onMeasure():決定View的大小 2.布局—&m
Android Studio安裝指南及genymotion配置
第一次安裝Java JDK ,要大於1.7版本,不安裝的話就會出現如下提示:這時點擊上面的JDK鏈接,跳轉到甲骨文的JDK下載頁面,根據操作系統,選擇下載版本,如下:下載