Secrets是为Android系统提供一个强大的密码保护箱,只要将各种密码放到箱子里即可,密码箱提供了导入导出的备份功能!项目如图:
效果如图:
关键源码简单分析:
public class CSVReader { //csv 读取类
public class CSVWriter { //csv写入类
密码箱操作的文件格式是csv
public class FileUtils { // csv文件操作 创建、打开、还原、备份、删除、分析、加载……等操作
public class Flip3dAnimation extends Animation { // 3D换页效果 动画
public class OS { // 操作系统 比如:
public static boolean isAndroid30() { // 是否支持Android 3.0的API
public static void hideSoftKeyboard(Context ctx, View view) { // 隐藏软键盘
public static void invalidateOptionsMenu(Activity activity) { // 无效的选项菜单
public static void configureSearchView(Activity activity, Menu menu) { // 搜索
public static boolean supportsScrollWheel() { // 设备是否支持滚轮或轨迹球
enum PasswordStrength { // 密码强度枚举
public class BCrypt { // 加密类 实现OpenBSD风格
public class SecurityUtils { //管理加密密钥加密和解密数据
public class Secret implements Serializable { // 封装密码
public class SaveService extends Service { // 保存服务 关键服务 方法如下:
public static synchronized void execute(Context context,
List<Secret> secrets, Cipher cipher, byte[] salt, int rounds) { //后台队列保存密钥
SaveService.secrets = secrets;
SaveService.cipher = cipher;
SaveService.salt = salt;
SaveService.rounds = rounds;
Intent intent = new Intent(context, SaveService.class);
context.startService(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, final int startId) { // 关键操作
synchronized (SaveService.class) {
final List<Secret> secrets = SaveService.secrets;
final Cipher cipher = SaveService.cipher;
final File file = getFileStreamPath(FileUtils.SECRETS_FILE_NAME);
final byte[] salt = SaveService.salt;
final int rounds = SaveService.rounds;
SaveService.secrets = null;
SaveService.cipher = null;
SaveService.salt = null;
SaveService.rounds = 0;
if (null != secrets && null != cipher) {
new Thread(new Runnable() {
@Override
public void run() {
int r = FileUtils.saveSecrets(SaveService.this, file,
cipher, salt, rounds, secrets);
// 保存成功否则刷新
if (0 == r)
backupManager.dataChanged();
// 不存在则备份
if (!FileUtils.restoreFileExist())
FileUtils.backupSecrets(SaveService.this, cipher,
salt, rounds, secrets);
stopSelf(startId);
}
}, "saveSecrets").start();
} else {
stopSelf(startId);
}
}
return START_STICKY;
}