本文属于学习分享,如有雷同纯属巧合 怎么会有雷同呢?
本着技术分享,学习互助的原则,我在此分享一款已经开源的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,加上如下的配置
<!-- 为了避免由于屏幕的旋转而导致activity被系统kill掉加上如下设定 --> <activity android:name="LockPatternActivity" android:configChanges="orientation|screenSize|keyboard|keyboardHidden" android:screenOrientation="user" android:theme="@style/Alp.42447968.Theme.Dark" > </activity>
2.好了我们来看看最简单实惠的主Activity,三个按钮:创建新的图案,比较图案,生成随机图案,具体的功能和使用请看代码,我已经写的很清楚了。
/** * 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算法摘要 //<activity // android:name="com.haibison.android.lockpattern.LockPatternActivity" // android:configChanges="keyboard|keyboardHidden|orientation|screenSize" // android:screenOrientation="user" // android:theme="@style/Alp.42447968.Theme.Dialog.Dark" > // <meta-data // android:name="encrypterClass" // android:value="...full.qualified.name.to.your.LPEncrypter" /> // </activity> // 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<Cell> 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<Cell> decrypt(Context context, char[] encryptedPattern) { List<Cell> 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; } }
4.结束,使用起来就这么简单,具体的修改看你的需求,这里不再讨论,最后留下demo下载链接,打开如意门
时间: 2024-11-02 07:52:17