本文属于学习分享,如有雷同纯属巧合 怎么会有雷同呢?
本着技术分享,学习互助的原则,我在此分享一款已经开源的android 图案解锁的实现。
项目地址:https://code.google.com/p/android-lockpattern/ (考虑到要,才写了这个demo)
它也是参考了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;
}
} | | |
抱歉忘记传lib了