不好意思,昨天我们写的代码有一点逻辑上的混乱的,我现在已经修改过来啦,下载的也修改过来啦
好啦,我们之前已经把设置向导的界面已经全部完成的了,而且界面也已经完成了三个的啦,今天我们把最后的一个界面完成它,还有把防盗的逻辑也完成一下
废话不多说,直接上代码
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!
今天源码下载