不好意思,昨天我们写的代码有一点逻辑上的混乱的,我现在已经修改过来啦,下载的也修改过来啦
好啦,我们之前已经把设置向导的界面已经全部完成的了,而且界面也已经完成了三个的啦,今天我们把最后的一个界面完成它,还有把防盗的逻辑也完成一下
废话不多说,直接上代码
com.xiaobin.security.ui.SetupGuide4Activity
package com.xiaobin.security.ui;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import com.xiaobin.security.R;
public class SetupGuide4Activity extends Activity implements OnClickListener
{
private Button bt_pervious;
private Button bt_finish;
private CheckBox cb_protected;
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.setup_guide4);
bt_pervious = (Button) findViewById(R.id.bt_guide_pervious);
bt_finish = (Button) findViewById(R.id.bt_guide_finish);
bt_finish.setOnClickListener(this);
bt_pervious.setOnClickListener(this);
cb_protected = (CheckBox) findViewById(R.id.cb_guide_protected);
sp = getSharedPreferences("config", Context.MODE_PRIVATE);
boolean isProtecting = sp.getBoolean("isProtected", false);
if(isProtecting)
{
cb_protected.setText("已经开启保护");
cb_protected.setChecked(true);
}
cb_protected.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if(isChecked)
{
cb_protected.setText("已经开启保护");
Editor editor = sp.edit();
editor.putBoolean("isProtected", true);
editor.commit();
}
else
{
cb_protected.setText("没有开启保护");
Editor editor = sp.edit();
editor.putBoolean("isProtected", false);
editor.commit();
}
}
});
}
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.bt_guide_finish :
if(cb_protected.isChecked())
{
Editor editor = sp.edit();
editor.putBoolean("setupGuide", true);//记录是否已经进行过设置向导了
editor.commit();
finish();
}
else
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提醒");
builder.setMessage("强烈建议您开启保护, 是否完成设置");
builder.setCancelable(false);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Editor editor = sp.edit();
editor.putBoolean("setupGuide", true);//记录是否已经进行过设置向导了
editor.commit();
finish();
}
});
builder.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Editor editor = sp.edit();
editor.putBoolean("setupGuide", true);//记录是否已经进行过设置向导了
editor.commit();
}
});
builder.create().show();
}
break;
case R.id.bt_guide_pervious :
Intent intent = new Intent(this, SetupGuide3Activity.class);
finish();
startActivity(intent);
//这个是定义activity切换时的动画效果的
overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out);
break;
default :
break;
}
}
}
好啦,就这个样子,我们的设置向导就全部完成的啦,现在我们就要来写完我们的防盗主界面啦,
lost_protected.xml
<?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:id="@+id/tv_lost_protected_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:text="@string/lostProtectedNumber"
android:textSize="20sp"/>
<View
style="@style/SetGuideUnderline"/>
<CheckBox
android:id="@+id/cb_lost_protected_isProtected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/isProtected"
android:textSize="20sp"/>
<View
style="@style/SetGuideUnderline"/>
<TextView
android:id="@+id/tv_lost_protected_guide"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/rePlayGuide"
android:textSize="20sp"/>
</LinearLayout>
com.xiaobin.security.ui.LostProtectedActivit
package com.xiaobin.security.ui;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
import com.xiaobin.security.R;
import com.xiaobin.security.utils.MD5Encoder;
public class LostProtectedActivity extends Activity implements OnClickListener
{
private SharedPreferences sp;
private Dialog dialog;
private EditText password;
private EditText confirmPassword;
private TextView tv_protectedNumber;
private TextView tv_protectedGuide;
private CheckBox cb_isProtected;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
sp = getSharedPreferences("config", Context.MODE_PRIVATE);
if(isSetPassword())
{
showLoginDialog();
}
else
{
showFirstDialog();
}
}
private void showLoginDialog()
{
dialog = new Dialog(this, R.style.MyDialog);
View view = View.inflate(this, R.layout.login_dialog, null);
password = (EditText) view.findViewById(R.id.et_protected_password);
Button yes = (Button) view.findViewById(R.id.bt_protected_login_yes);
Button cancel = (Button) view.findViewById(R.id.bt_protected_login_no);
yes.setOnClickListener(this);
cancel.setOnClickListener(this);
dialog.setContentView(view);
dialog.setCancelable(false);
dialog.show();
}
private void showFirstDialog()
{
dialog = new Dialog(this, R.style.MyDialog);
//dialog.setContentView(R.layout.first_dialog);
View view = View.inflate(this, R.layout.first_dialog, null);//这种填充布局的方式比较方便,峭用拿到一个LayoutInflate对象
password = (EditText) view.findViewById(R.id.et_protected_first_password);
confirmPassword = (EditText) view.findViewById(R.id.et_protected_confirm_password);
Button yes = (Button) view.findViewById(R.id.bt_protected_first_yes);
Button cancel = (Button) view.findViewById(R.id.bt_protected_first_no);
yes.setOnClickListener(this);
cancel.setOnClickListener(this);
dialog.setContentView(view);
dialog.setCancelable(false);
dialog.show();
}
private boolean isSetPassword()
{
String pwd = sp.getString("password", "");
if(pwd.equals("") || pwd == null)
{
return false;
}
return true;
}
private boolean isSetupGuide()
{
return sp.getBoolean("setupGuide", false);
}
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.bt_protected_first_yes :
String fp = password.getText().toString().trim();
String cp = confirmPassword.getText().toString().trim();
if(fp.equals("") || cp.equals(""))
{
Toast.makeText(this, "密码不能为空", Toast.LENGTH_SHORT).show();
return;
}
else
{
if(fp.equals(cp))
{
Editor editor = sp.edit();
editor.putString("password", MD5Encoder.encode(fp));
editor.commit();
dialog.dismiss();
if(!isSetupGuide())
{
finish();
Intent intent = new Intent(this, SetupGuide1Activity.class);
startActivity(intent);
}
}
else
{
Toast.makeText(this, "两次密码不相同", Toast.LENGTH_SHORT).show();
return;
}
}
dialog.dismiss();
break;
case R.id.bt_protected_first_no :
dialog.dismiss();
finish();
break;
case R.id.bt_protected_login_yes :
String pwd = password.getText().toString().toString();
if(pwd.equals(""))
{
Toast.makeText(this, "请输入密码", Toast.LENGTH_SHORT).show();
}
else
{
String str = sp.getString("password", "");
if(MD5Encoder.encode(pwd).equals(str))
{
if(isSetupGuide())
{
setContentView(R.layout.lost_protected);
tv_protectedNumber = (TextView) findViewById(R.id.tv_lost_protected_number);
tv_protectedGuide = (TextView) findViewById(R.id.tv_lost_protected_guide);
cb_isProtected = (CheckBox) findViewById(R.id.cb_lost_protected_isProtected);
tv_protectedNumber.setText("手机安全号码为:" + sp.getString("number", ""));
tv_protectedGuide.setOnClickListener(this);
boolean isProtecting = sp.getBoolean("isProtected", false);
if(isProtecting)
{
cb_isProtected.setText("已经开启保护");
cb_isProtected.setChecked(true);
}
cb_isProtected.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if(isChecked)
{
cb_isProtected.setText("已经开启保护");
Editor editor = sp.edit();
editor.putBoolean("isProtected", true);
editor.commit();
}
else
{
cb_isProtected.setText("没有开启保护");
Editor editor = sp.edit();
editor.putBoolean("isProtected", false);
editor.commit();
}
}
});
}
dialog.dismiss();
}
else
{
Toast.makeText(this, "密码错误", Toast.LENGTH_SHORT).show();
}
}
break;
case R.id.bt_protected_login_no :
dialog.dismiss();
finish();
break;
case R.id.tv_lost_protected_guide : //重新进入设置向导
finish();
Intent setupGuideIntent = new Intent(this, SetupGuide1Activity.class);
startActivity(setupGuideIntent);
break;
default :
break;
}
}
}
com.xiaobin.security.ui.SetupGuide2Activity
package com.xiaobin.security.ui;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import com.xiaobin.security.R;
public class SetupGuide2Activity extends Activity implements OnClickListener
{
private Button bt_bind;
private Button bt_next;
private Button bt_pervious;
private CheckBox cb_bind;
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.setup_guide2);
sp = getSharedPreferences("config", Context.MODE_PRIVATE);
bt_bind = (Button) findViewById(R.id.bt_guide_bind);
bt_next = (Button) findViewById(R.id.bt_guide_next);
bt_pervious = (Button) findViewById(R.id.bt_guide_pervious);
bt_bind.setOnClickListener(this);
bt_next.setOnClickListener(this);
bt_pervious.setOnClickListener(this);
cb_bind = (CheckBox) findViewById(R.id.cb_guide_check);
//初始化CheckBox状态
String sim = sp.getString("simSerial", null);
if(sim != null)
{
cb_bind.setText("已经绑定");
cb_bind.setChecked(true);
}
else
{
cb_bind.setText("没有绑定");
cb_bind.setChecked(false);
resetSimInfo();
}
cb_bind.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if(isChecked)
{
cb_bind.setText("已经绑定");
setSimInfo();
}
else
{
cb_bind.setText("没有绑定");
resetSimInfo();
}
}
});
}
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.bt_guide_bind :
setSimInfo();
cb_bind.setText("已经绑定");
cb_bind.setChecked(true);
break;
case R.id.bt_guide_next :
Intent intent = new Intent(this, SetupGuide3Activity.class);
finish();
startActivity(intent);
//这个是定义activity切换时的动画效果的
overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out);
break;
case R.id.bt_guide_pervious :
Intent i = new Intent(this, SetupGuide1Activity.class);
finish();
startActivity(i);
//这个是定义activity切换时的动画效果的
overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out);
break;
default :
break;
}
}
private void setSimInfo()
{
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String simSerial = telephonyManager.getSimSerialNumber();//拿到sim卡的序列号,是唯一的
Editor editor = sp.edit();
editor.putString("simSerial", simSerial);
editor.commit();
}
private void resetSimInfo() //解除绑定
{
Editor editor = sp.edit();
editor.putString("simSerial", null);
editor.commit();
}
}
好啦,到现在为止,我们的手机防盗这个功能的界面就基本上完成的啦,
那么现在就进入我们的重头戏啦,就是防盗逻辑的完成啦,
我们现在的防盗是这样的,手机丢失的时候,小偷肯定是会换sim卡的嘛,所以就要重启啦,那我们就在启动完成之后,比较一下现在的sim卡,是不是我们之前设置保护的sim卡,如果不是,那就发送一条短信到已经设置了的安全号码那里。
所以现在我们只要写一个广播接收者,把手机重启的广播接收到,然后再起进行判断就行啦
好啦,现在直接上代码
com.xiaobin.security.receiver.BootCompleteReceiver
package com.xiaobin.security.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
public class BootCompleteReceiver extends BroadcastReceiver
{
private SharedPreferences sp;
@Override
public void onReceive(Context context, Intent intent)
{
sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
boolean isProtected = sp.getBoolean("isProtected", false);
//看看是不是开启了保护
if(isProtected)
{
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
//开机后,拿到当前sim卡的标识,与我们之前存放的标识对比
String currentSim = telephonyManager.getSimSerialNumber();
String protectedSim = sp.getString("simSerial", "");
if(!currentSim.equals(protectedSim))
{
//拿到一个短信的管理器,要注意不要导错包,是在android.telephony下的
SmsManager smsManager = SmsManager.getDefault();
String number = sp.getString("number", "");
//发送短信,有5个参数,第一个是要发送到的地址,第二个是发送人,可以设置为null,第三个是要发送的信息,第四个是发送状态,第五个是发送后的,都可以置为null
smsManager.sendTextMessage(number, null, "Sim卡已经变更了,手机可能被盗", null, null);
}
}
}
}
好啦,现在我们就要在AndroidManifest文件里面注册这个广播接收者啦
<receiver
android:name="com.xiaobin.security.receiver.BootCompleteReceiver">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED"/><!-- 这个是开机完成后的广播 -->
</intent-filter>
</receiver>
当然,现在还不行的,我们还要把相应的权限加上
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
好啦,现在我们的逻辑就基本上完成的啦
但现在这个功能还不是很完整,所以我们后续的课程将会继续完善这个防盗的功能的,比如加入gps定位啦,这些的。
好,今天的代码就到这里了,如果有什么不明白的,和指导的,欢迎留言!,明天将会完善这个防盗功能,加入gps!