YOU'VE ENTERED A SIMPLE ANDROIDBLOG, WELCOME.

Develop And Improve。

极简密码开发日记Day03

Things have done

花了一天时间搞定了随机密码生成器、主界面、数据库,然而又花了一天时间解决Bug….不过借此机会学会了很多东西只能说这波不亏

具体实现

1.随机密码生成器

Google到了很多方法,选择了一个广为认可并且非常方便的方法

1
2
3
4
5
6
7
8
9
static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-=?.";
static SecureRandom rnd = new SecureRandom();

public static String randomString(int len) {
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++)
sb.append(AB.charAt(rnd.nextInt(AB.length())));
return sb.toString();
}

使用SecureRandom()函数在事先给定的密码字符集中随机获得一个字符,循环一定次数得到密码串。

方法传入的密码长度是从SeekBar中获得的,SeekBar我使用的是ProgressHint这一开源库,通过

1
2
seekBar.setMax(16);
seekBar.setProgress(6);

这两行代码实现设置最大长度为16,初始长度6,最终实现的效果如下图,拖动SeekBar设置密码长度,点击按钮生成密码并设置到Edittext上

http://pic.yupoo.com/333ddd/FRAlz931/ZN4kh.jpg

2.数据库

作为一个密码管理软件,如果数据的存放不够安全的话简直无法想象,所以在着手写数据库时我就打算找一个安全的数据库,最终选择了SqlCipher,一个对SqlLite进行扩展的开源库,AES-256加密方法数据库完全加密,在使用过程中没有什么难题,用法和普通SqlLite基本完全相同,只不过在SQLiteDatabase db = this.getWritableDatabase();方法中要加上一个密码作为打开和写入的唯一凭证,同时在载入数据库时候要加一局SQLiteDatabase.loadLibs(this);

数据库的操作基本大同小异,我新建了一个DatabaseHelper类封装数据库创建、升级、删除以及增删改查各项操作,刚开始在getRecordCounts()方法中犯了一个错误,cursor.close();之后我又return cursor.getCount();很低级的错误。

3.主界面

本来想在主界面显示记录简略信息,点击后打开详情界面,但是偶然看到了一个很酷炫的开源库FoldingCell 下面是官方提供的效果图

https://github.com/Ramotion/folding-cell-android/raw/master/folding_cell_preview.gif

我实现的初步效果图如下

http://pic.yupoo.com/333ddd/FRAlz57j/njA0T.jpg

http://pic.yupoo.com/333ddd/FRAlzcUL/7pnCk.jpg

本来折叠状态下控件也使用纯色作为背景,后来发现可以用xml文件方便地描绘边框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

<solid android:color="#FAFAFA" />

<stroke
android:width="1dp"
android:color="#6D4C41" />

<padding
android:bottom="1dp"
android:left="0.5dp"
android:right="0.5dp"
android:top="1dp" />
<corners
android:bottomLeftRadius="5dp"
android:bottomRightRadius="5dp"
android:topLeftRadius="5dp"
android:topRightRadius="5dp" />
</shape>

在使用这个控件时发现一个问题,因为我使用的是ListView,新建一个RecordAdapter注入控件,但是实际使用中每六个控件会显示同样的动画效果,即展开第一个控件后第六个也会自动展开,谷歌后貌似是ListView的回收机制与这个库之间的Bug,在开源库里Issue中也有很多人提出这个问题,需要添加fc.fold(true);这一行代码避免这一Bug,不过这样在控件滑出屏幕后会自动折叠。

Things to do

引导页、解锁功能