上次写到在进入手机但·防盗界面时需要有密码限制,首先第一次进入时会弹出对话框提示用户设置密码;再次进入时会要求用户输入密码;这次来具体实现上述功能。

首次登录,设置密码

首先,我们的密码是保存在SharePreference中的”password”字段里的,在登录时后台需要校验该字段是否已经设置了密码,若未设置则弹出对话框让用户设置,否则要用户输入密码进入手机防盗界面;

  • 校验是否设置了密码
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);sp = getSharedPreferences("config", Context.MODE_PRIVATE);// 判读用户是否已经设置了密码if (isPwdSetup()) {Log.i(TAG, "设置了密码,弹出输入密码的对话框");} else {Log.i(TAG, "未设置密码,弹出设置密码对话框");showFirstEntryDialog();}}/*** 检查sharedpreference中是否有密码的设置* * @return*/private boolean isPwdSetup() {String password = sp.getString("password", null);if (password == null) {return false;} else {if ("".equals(password)) {return false;} else {return true;}}}

  • showFirstEntryDialog(),弹出用户设置密码对话框
/*** 第一次进入程序时弹出的设置密码的对话框 * 使用自定义对话框样式*/private void showFirstEntryDialog() {dialog = new Dialog(this, R.style.MyDialog);
//      dialog.setContentView(R.layout.first_entry_dialog);// 设置要显示的内容View view = View.inflate(this, R.layout.first_entry_dialog, null);et_pwd = (EditText) view.findViewById(R.id.et_first_entry_pwd);et_pwd_confirm = (EditText) view.findViewById(R.id.et_first_entry_pwd_confirm);Button bt_confirm = (Button) view.findViewById(R.id.bt_first_dialog_confirm);Button bt_cancel = (Button) view.findViewById(R.id.bt_first_dialog_cancel);// 设置按钮对应的点击事件bt_confirm.setOnClickListener(this);bt_cancel.setOnClickListener(this);dialog.setContentView(view);dialog.setCanceledOnTouchOutside(false);// 设置dialog不可以点击其他地方时消失dialog.setCancelable(false);// 设置dialog不可以点返回键时消失dialog.show();}

  • 用户输入后,后台对用户的输入进行处理
@Overridepublic void onClick(View view) {switch(view.getId()){// 点击取消case R.id.bt_first_dialog_cancel:dialog.dismiss();break;case R.id.bt_first_dialog_confirm:String pwd = et_pwd.getText().toString().trim();String pwd_confirm = et_pwd_confirm.getText().toString().trim();// 输入的密码中包好空值if("".equals(pwd) || "".equals(pwd_confirm)){Toast.makeText(getApplicationContext(), "输入不能为空!", Toast.LENGTH_LONG).show();return;}else{if(pwd.equals(pwd_confirm)){Editor editor = sp.edit();editor.putString("password", pwd);editor.commit();}// 两次输入不一致else{Toast.makeText(getApplicationContext(), "两次输入密码不相同!", Toast.LENGTH_LONG).show();return;}}dialog.dismiss();break;}}

效果如下:

初次进入手机防盗界面:

未输入时点击确定:

两次输入密码不相同:


再次登录,输入密码

  • 弹出对话框样式:normal_entry_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="300dip"android:layout_height="280dip"android:gravity="center_horizontal"android:orientation="vertical" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登录"android:textColor="@color/textcolor"android:textSize="24sp" /><LinearLayoutandroid:layout_width="300dip"android:layout_height="wrap_content"android:background="#ffc8c8c8"android:orientation="vertical" ><EditTextandroid:id="@+id/et_normal_entry_pwd"android:layout_width="300dip"android:layout_height="wrap_content"android:hint="请输入密码"android:password="true" /></LinearLayout><LinearLayoutandroid:layout_width="300dip"android:layout_height="50dip"android:gravity="center"android:orientation="horizontal" ><Buttonandroid:id="@+id/bt_normal_dialog_confirm"android:layout_width="140dip"android:layout_height="40dip"android:background="@drawable/button_background"android:text="确定"android:textColor="#ffffffff" /><Buttonandroid:id="@+id/bt_normal_dialog_cancel"android:layout_width="140dip"android:layout_height="40dip"android:layout_marginLeft="3dip"android:background="@drawable/button_background"android:text="取消" /></LinearLayout></LinearLayout>

  • showNormalEntryDialog方法
/*** 正常登录的对话框* */private void showNormalEntryDialog() {dialog = new Dialog(this, R.style.MyDialog);View view = View.inflate(this, R.layout.normal_entry_dialog, null);et_pwd = (EditText) view.findViewById(R.id.et_normal_entry_pwd);Button bt_confirm = (Button) view.findViewById(R.id.bt_normal_dialog_confirm);Button bt_cancel = (Button) view.findViewById(R.id.bt_normal_dialog_cancel);// 设置按钮对应的点击事件bt_confirm.setOnClickListener(this);bt_cancel.setOnClickListener(this);dialog.setContentView(view);dialog.setCanceledOnTouchOutside(false);// 设置dialog不可以点击其他地方时消失
//      dialog.setCancelable(false);// 设置dialog不可以点返回键时消失dialog.show();}

  • 按键处理:
@Overridepublic void onClick(View view) {switch(view.getId()){case R.id.bt_normal_dialog_cancel:dialog.dismiss();break;case R.id.bt_normal_dialog_confirm:String input_pwd = et_pwd.getText().toString();if("".equals(input_pwd)){Toast.makeText(getApplicationContext(), "输入不能为空!", Toast.LENGTH_LONG).show();return;}else{String password = sp.getString("password", "");if(!password.equals(input_pwd)){Toast.makeText(getApplicationContext(), "输入密码不正确,请重新输入!", Toast.LENGTH_LONG).show();et_pwd.selectAll();// 用户输入错误后,对文本进行全选,方便用户进行删除重新输入return;}}Log.i(TAG, "加载手机防盗主界面");dialog.dismiss();break;}}

效果如下:


密码加密存储

目前我们的密码存储都是以明文存储在SharePreference中的,因此有点Android开发基础的人都可以获取到我们设置的密码。

考虑使用加密算法对密码加密后进行存储。

使用JavaSe提供的MessageDigest类进行加密。MessageDigest支持的加密算法包括:MD5、SHA-1、SHA-256。

package com.liuhao.mobilesafe.util;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class MD5Encoder {public static String encode(String pwd) {try {MessageDigest md = MessageDigest.getInstance("MD5");byte[] bytes = md.digest(pwd.getBytes());StringBuffer sb = new StringBuffer();for (byte b : bytes) {String str = Integer.toHexString(0xff & b);// byte是八位字节存储的,转化为16进制数,直接与11111111相与if (str.length() == 1) {sb.append("0" + str);} else {sb.append(str);}}return sb.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();throw new RuntimeException("不存在加密算法");}}
}

这样在存储密码时调用encode()方法即可对密码进行存储。在读取时也要用加密后的密文与已存储的进行对比。

editor.putString("password", MD5Encoder.encode(pwd));if(!password.equals(MD5Encoder.encode(input_pwd))){Toast.makeText(getApplicationContext(), "输入密码不正确,请重新输入!", Toast.LENGTH_LONG).show();et_pwd.selectAll();// 用户输入错误后,对文本进行全选,方便用户进行删除重新输入return;
}

其实我们仅仅简单的一次加密也是很不保险的,虽说从算法实现上来说md5加密是不可逆的,但是有些“别有用心”的人,竟然将所有可预见的字符串对应的密文都算出来了,真是。。。

比如这个网站:http://www.cmd5.com/

惊呆了,有木有!

所以,以后在重要的网站设置密码时一定要设的复杂一点!!!

【边做项目边学Android】手机安全卫士07-手机防盗之进入限制相关推荐

  1. 【边做项目边学Android】手机安全卫士09-手机防盗界面设置向导1

    本次主要做手机防盗界面的设置向导功能界面的设计. 需求: 当用户进入手机防盗界面时,判断用户是否已经进行过设置向导: 如果用户已经设置过手机防盗,则不再提示用户进入手机向导 若还没有设置,则提示用户进 ...

  2. 【边做项目边学Android】手机安全卫士10-设置向导之绑定SIM卡

    上回主要做了设置向导界面的界面设计,主要涉及到界面的布局和一些控件的使用.这次要做设置向导界面的功能具体实现. 首先,4个界面分别是(重复度很大,这里就不再贴到正文中了) /mobilesafe/re ...

  3. 【边做项目边学Android】手机安全卫士04_02:从服务器下载并安装新版本安装包

    文件下载 1. 下载文件业务类 下载文件的操作也属于业务方法,所以在com.liuhao.mobilesafe.engine中创建一个DownloadFileTask下载文件的类. 其中的getFil ...

  4. ios+android+次留,边做iOS边学Android(三):Activity生命周期+通信

    边做iOS边学Android(一):新建一个project 边做iOS边学Android(二):认识几个常用的控件 趁着不忙赶紧多写点,鬼知道后面又有什么需求要忙... 这次就看一下Activity的 ...

  5. 边做游戏边学android,Android Studio App 边做边学-微课视频版

    Android Studio App 边做边学-微课视频版 编辑 锁定 讨论 上传视频 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! <Android Studio ...

  6. Android项目:基于Android家庭理财系统手机软件设计(计算机毕业设计)

    每个家庭都希望过幸福美满的生活,但大多数人可能一生都无法满足.现代生活中我们除了追求精神上的财富不可缺少的也要追求房子.车子.高档理财等这些象征物质财富的东西.生活质量的保证,还是多数人努力追求的目标 ...

  7. 研究生期间做项目所学到的一些经验

    本文主要分享研究生期间所学到的一些科研和项目经验,实践部分偏重于硬件电路.点滴琐碎,还请见谅. 一  项目所得  1.1 心得体会 任何事物都要从最简单.最基本的构架入手,理解复杂的.--接触学习新东 ...

  8. 做项目、学课程不怕坑多,就怕你认知不够

    近期,一些粉丝找我帮他们鉴别项目真假和学习课程的坑.有些粉丝还和我分享了他们被割韭菜的经历,听完甚为痛心.实际上各种各样的骗术和招数,我在微信公众号上也写过不少,可能大家只是看过瘾罢了,根本就不以为然 ...

  9. 《教我兄弟学Android逆向01 编写第一个Android程序》

    前言 之所以准备写这一系列逆向的教程是因为有一些同学私信我说自己想学习Android逆向但是不知道怎么去学习 包括自己身边的一些计算机专业的同学 在大学里面老师讲的那些东西要么是自己不感兴趣 要么是自 ...

最新文章

  1. 利用 Cloudera 实现 Hadoop (一)
  2. 阿里云Redis账号
  3. python pass 占位符 占位语句
  4. maven实战笔记-12
  5. 库存管理系统软件测试,药房库存管理系统模块测试用例
  6. SPSS学习系列之SPSS Statistics(简称SPSS)是什么?
  7. c++ 嵌套类 内部类
  8. 使用Selenium和HTML中的动态ID进行Java测试
  9. Maven学习总结(9)——使用Nexus搭建Maven私服
  10. ORA-14402: 更新分区关键字导致分区的更改
  11. socket 实现HttpClient简单类+csdn登陆源码
  12. docker镜像命令
  13. 工科数学分析寒假预习day2 正项级数的敛散性
  14. python excel行列转置_用powershell+excel行列转置三步走
  15. yandex.com搜索等级、限制设置
  16. linux下下载fnl数据,python处理FNL数据的grib文件和nc文件(纬度存储的问题)
  17. 电脑清灰记录(惠普暗影精灵5)
  18. 区块链开发(五)搭建以太坊区块链浏览器
  19. 三星手机com.sec.android.app.sams,三星健康(com.sec.android.app.shealth) - 6.9.1.017 - 应用 - 酷安...
  20. 关于TCP的一些基础知识(1)

热门文章

  1. ThinkPhp上传文件提示“没有上传的文件”解决方案
  2. HDU 幸福列车 优先队列
  3. 教您用数学课件制作工具演示线变二面角
  4. Coursera Python学习笔记(二)数据结构
  5. nginx-基础知识
  6. ubuntu挂载4T新硬盘记录
  7. php做网站弊端,PHP 做网站真好用。
  8. 固态硬盘的S.M.A.R.T详解
  9. 杭电信工计算机专业浙江省排名第几,2017杭州电子科技大学专业排名_杭州电子科技大学专业排行榜(2)...
  10. JZOJ4883. 【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰 2017.10(B组)