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; }