[安卓]手机管家(五)防盗之加密

在homeActivity里调用,layout,用到了hint,提示

<pre name="code" class="java"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >   
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        android:text="功能列表"
        android:gravity="center"
        android:textSize="25sp"
        android:background="#00FF00"/>
    <com.leo.mobilemanager.ui.FocusTextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="您当前使用的是手机卫士2.0版本,当前最新版本是3.0版本,建议下载!"
        android:singleLine="true"
        android:textSize="14sp"
        android:ellipsize="marquee"/>
    <GridView
        android:id="@+id/gv_home_nine"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:numColumns="3" >
    </GridView>
</LinearLayout>



@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			// TODO Auto-generated method stub
            switch (position) {
                case 0:
				//第一次进入的时候,弹出一个对话框,让用户输入密码,两次确认。
					showSetPasswordDialog();
	
				break;
			case 8:
				//跳入到setting页面
				Intent intent = new Intent(HomeActivity.this,SettingActivity.class);
				startActivity(intent);
				
				break;

			 default:
				break;
			}
		}	
	}
	private void showSetPasswordDialog() {
		// TODO Auto-generated method stub
		Builder builder = new Builder(this);
		View view = View.inflate(this, R.layout.dialog_setpw, null);
		builder.setView(view);
		builder.show();
	}

输入密码框架确定,完善细节

第二个密码框确认是否密码一致,一致了才进入模块,不一致要求重新输入

在layout里加入密码属性



取消,调用dismiss需要show的返回值类型,alertdialog。

//builder有三种创建方式,为了能够实现取消,需要有一个builder实体
        bt_cancle.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {				
				//将dialog dismiss掉
				dialog.dismiss();
			}
		});


具体的对比逻辑,首先是判断是否为空,不为空的时候再去对比是否相同,不同就要重新输入



一致需要SharedPreferences保存数据,第一次输入成功后为了加上印象,一般会让用户再登陆一次,需要将前面这个dialogdismiss掉


if (password.equals(passwordconfrim)) {
						//将密码保存起来
						Toast.makeText(HomeActivity.this, "密码输入ok,即将保存", 1).show();					
						Editor editor =sp.edit();	                        
	                    editor.putString("password", password);
	                    editor.commit();
	                    //在确认后一般要求重新登陆一次以方便用户加深记忆,先dismiss当前dialog
	                    dialog.dismiss();	
			    	}

注意这个dialog的实现,在上面用builder.show,但是需要用alertDialog接收

private void showSetPasswordDialog() {
		// TODO Auto-generated method stub
		Builder builder = new Builder(this);
		View view = View.inflate(this, R.layout.dialog_setpw, null);
		//在匿名内部类里需要加上final才能被局部变量引用
		builder.setView(view);
		//builder返回一个AlertDialog,显示出来还要接收下
		//必须用dialog接收方便后面dismiss掉,正常写法是创建,显示,接收
		/*final AlertDialog dialog = builder.create();
		  builder.show();*/
		final AlertDialog dialog = builder.show();

在刚进入的时候也需要判断下,如果已经保存了,则只是需要一次输入的框,第一次登陆,没有保存的,才需要两次输入对比,这里也要实现一个新的方法和layout

switch (position) {
                case 0:
				//第一次进入的时候,弹出一个对话框,让用户输入密码,两次确认。
                	//如果没要保存的需要输入和再次输入
                	if (sp.getString("password", "").length()==0) {
    					showSetPasswordDialog();
    				}
    				else {
    					//如果是已经有了,则直接进入单次输入框
    					showInputPasswordDialog();
    				}
	
				break;


单次输入框的实现

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" > 
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:text="输入密码"
        android:gravity="center"
        android:background="#00ff00"
        android:textSize="15sp"/>
    <EditText 
        android:id="@+id/et_inputdialog_password"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        android:inputType="textPassword"/>  
      <LinearLayout
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:orientation="horizontal">
          <Button
              android:layout_weight="1"
              android:layout_height="wrap_content"
              android:layout_width="0dp" 
              android:id="@+id/bt_inputdialog_ok"
              android:text="确认"/>
           <Button
              android:layout_weight="1"
              android:layout_height="wrap_content"
              android:layout_width="0dp" 
              android:id="@+id/bt_inputdialog_cancle"
              android:text="取消"/>
      </LinearLayout>
</LinearLayout>

单输入框框的架子

private void showInputPasswordDialog() {
		Builder builder  = new Builder(this);  
		View view = View.inflate(this, R.layout.dialog_inputpw, null);
		builder.setView(view);
		final AlertDialog dialog =builder.show();
		
		final EditText et_password = (EditText) view.findViewById(R.id.et_inputdialog_password);
 
		Button bt_ok = (Button) view.findViewById(R.id.bt_inputdialog_ok);
		Button bt_cancle = (Button) view.findViewById(R.id.bt_inputdialog_cancle);
		
		bt_ok.setOnClickListener(new OnClickListener() {		
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
					
			}
		});	
		bt_cancle.setOnClickListener(new OnClickListener() {		
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
			}
		});		
	}	

完善响应,一定要注意,相应时,string类型的数据是在onclick里获得,而不是在重载函数外,匿名内部类里获得,报空

bt_ok.setOnClickListener(new OnClickListener() {		
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				String password_saved = sp.getString("password", "");
				String password_input = et_password.getText().toString();
                if (password_input.length()!=0) {
					if (password_input.equals(password_saved)) {
						//密码跟保存的一致,则可以进入该模块
						Toast.makeText(HomeActivity.this, "密码正确,即将进入设置模块", 1).show();
						dialog.dismiss();
						//进入该模块				
					}
					else {
						Toast.makeText(HomeActivity.this, "密码不正确,请重新输入", 1).show();
					}
				 }
			 }
		});	

正确后需要进入一个新的layout,这个暂时留在后面,现在需要实现加密,否则手机丢了,直接把文件导出就能看到密码了~


通常我们以MD5加密

在实现MD5加密主要有以下几个步骤

 首先得到一个信息摘要器 MessageDigest 然后设置MD5

我们获取要加密的数据 例如 password=“123456”

将这些数据转换成字节数据 password.getBytes()

循环对每个字节数进行处理

这里主要是做2个处理 一个是 对每个字节数据进行 与运算 一般是与上一个16进制的数

例如 int number = p $ 0xff;

然后 将得到的number'进行转换为16进制的数

Integer.toHexString(number);

如果这个数转换后的长度为1 那么我们就补0

不满八个二进制那么我们就补全


在工具包里加入一个MD5的工具

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {	
	public static String getDegist(String password){
	   String 	degist = "";
	   try {
			MessageDigest  md = MessageDigest.getInstance("md5");
			byte[]  digest =md.digest(password.getBytes());
			StringBuffer sb =new StringBuffer();
			for (byte b : digest) {
				int resutl = b& 0xff;
				String str=    Integer.toHexString(resutl);
				if (str.length()==1) {
					sb.append("0");
				}
				sb.append(str);
			}
			degist =sb.toString();
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	   
	   return degist;
	}
}

输入后要解密

if (password.equals(passwordconfrim)) {
						//将密码保存起来
						Toast.makeText(HomeActivity.this, "密码输入ok,即将保存", 1).show();					
						Editor editor =sp.edit();	
						//将明文转成密文,password123-》加密 
                        String degist = MD5Utils.getDegist(password);
	                    editor.putString("password", degist);
	                    editor.commit();
	                    //在确认后一般要求重新登陆一次以方便用户加深记忆,先dismiss当前dialog
	                    dialog.dismiss();	
			    	}

有保存后,再次输入需要对比,拿到的是密文,我们需要把再次输入的也生成密文再对比

@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				String password_saved = sp.getString("password", "");
				String password_input = et_password.getText().toString();
                if (password_input.length()!=0) {
                	String password_input_digest = MD5Utils.getDegist(password_input);
					if (password_input_digest.equals(password_saved)) {
						//密码跟保存的一致,则可以进入该模块
						Toast.makeText(HomeActivity.this, "密码正确,即将进入设置模块", 1).show();
						dialog.dismiss();
						//进入该模块				
					}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值