手机防盗软件的实现
2012-07-27 14:20:20 来源: 评论:0 点击:41
暑假第三十五天,今天学习的是手机防盗软件的实现过程,感觉这个软件也挺不错的,所以拿出来和大家一块分享一下,其实通过本程序你可以学到,如何注册一个账号,还有广播时间,发送短信等功能,嗯,最近呢,表示对电脑很烦,每天10个小时以上都在电脑旁,这样的日子,我们足足过了三十多天,最近感觉小有不适,眼睛貌似都有不舒服,再加上天热,哎!我们这群痛并着快乐的程序员们,不过这样是日子也快结束了,等到8月底,自己就可以放心的回家喽,那样天天没有电脑的日子,可以享受一个月再继续开学,嗯,想家ing... ... 嘿嘿,废话不多说了看看实现的过程吧
1,先看看布局
main.xml一个编辑框两个按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg"
android:orientation="vertical" >
<EditText
android:id="@+id/safenumber"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入可接受本手机短信的手机号" >
</EditText>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开始防盗" >
</Button>
<Button
android:id="@+id/modify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="修改密码" >
</Button>
</LinearLayout>
</LinearLayout>
2.password.xml 两个编辑框 ,两个按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<EditText
android:id="@+id/username"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名:"
/>
<EditText
android:id="@+id/password"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:password="true"
android:hint="请输入密码:" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="确定" />
<!-- android:layout_weight="1" 权重设置占据1/2 -->
<Button
android:id="@+id/cancle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="取消" />
</LinearLayout>
</LinearLayout>
3.看看主活动是实现的过程PhoneBakActivity.java
package com.wang;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class PhoneBakActivity extends Activity {
// 设置对话框
AlertDialog setPasswordDialog;
// 显示对话框
AlertDialog showPasswordDialog;
SharedPreferences sharedPreferences;
EditText et_safenumber;
Button btn_start;
Button btn_modify;
// o判断是否的第一次使用和是否已经开启防盗功能
boolean isFirst;
boolean isStart;
// 获取手机SIM卡的信息
TelephonyManager telephonyManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 得到系统电话服务的权限
telephonyManager = (TelephonyManager) this
.getSystemService(TELEPHONY_SERVICE);
/***
* 保存用户的数据 检索和持有参数文件的内容的“名字”, 返回一个SharedPreferences,
* 通过它可以检索和修改它的值,并保存在data文件夹下
*/
sharedPreferences = this.getSharedPreferences("data",
MODE_WORLD_READABLE);
// 判断是否是第一次使用
isFirst = sharedPreferences.getBoolean("first", true);
if (isFirst) {
// 调用设置对话框的方法
showSetPasswordDialog();
return;
} else {
// 调用输入密码的方法
showInputPasswordDialog();
}
}
/****
*
* 显示输入密码的对话框
*
* *
***/
private void showInputPasswordDialog() {
// 创建一个dialog
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 渲染器,进行对XML渲染成对象
LayoutInflater inflater = LayoutInflater.from(this);
// 将布局添加到渲染器的对象中
View view = inflater.inflate(R.layout.password, null);
// 实例化 组件
final EditText et_username = (EditText) view
.findViewById(R.id.username);
final EditText et_password = (EditText) view
.findViewById(R.id.password);
Button btn_ok = (Button) view.findViewById(R.id.ok);
Button btn_cancle = (Button) view.findViewById(R.id.cancle);
// 设置监听事件
btn_ok.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 得到输入的密码和用户名
String username = et_username.getText().toString();
String password = et_password.getText().toString();
// 当输入的密码和用户名为空的时候提示一下
if (username.trim().equals("") || password.trim().equals("")) {
Toast.makeText(PhoneBakActivity.this, "用户名和密码不能为空",
Toast.LENGTH_LONG).show();
return;
}
// 得到保存的用户名和密码
String savedUsername = sharedPreferences.getString("username",
"");
String savedPassword = sharedPreferences.getString("password",
"");
// 如果用户名和密码相同的时候
if (username.trim().equals(savedUsername)
&& password.trim().equals(savedPassword)) {
// 调用init方法
init();
// 取消输入密码的dialog
showPasswordDialog.dismiss();
} else {
// 提示
Toast.makeText(PhoneBakActivity.this, "用户名或者密码错误,请重新输入",
Toast.LENGTH_LONG).show();
return;
}
}
});
btn_cancle.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 结束
finish();
}
});
// 标题
builder.setTitle("输入密码");
// 构造view对象
builder.setView(view);
// 创建和显示对话框
showPasswordDialog = builder.create();
showPasswordDialog.show();
}
/******
* 初始化的方法
*
* *
****/
private void init() {
setContentView(R.layout.main);
// 实例化组件
et_safenumber = (EditText) this.findViewById(R.id.safenumber);
btn_start = (Button) this.findViewById(R.id.start);
btn_modify = (Button) this.findViewById(R.id.modify);
// 得到输入的手机号
String savedNumber = sharedPreferences.getString("safenumber", "");
et_safenumber.setText(savedNumber);
// 判断是否关闭或者开启防盗功能
isStart = sharedPreferences.getBoolean("start", false);
if (isStart) {
// 设置激活状态为flase
et_safenumber.setEnabled(false);
btn_modify.setEnabled(false);
btn_start.setText("停止防盗");
}
btn_start.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 如果开启
if (isStart) {
// 保存到编辑器中
Editor editor = sharedPreferences.edit();
editor.putBoolean("start", false);
// 保存手机号到编辑器中
editor.commit();
// 设置激活状态为true
et_safenumber.setEnabled(true);
btn_modify.setEnabled(true);
btn_start.setText("开始防盗");
isStart = false;
} else {
// 获得输入的安全是手机号码
String safeNumber = et_safenumber.getText().toString();
// 当输入的手机号码为空的时候,提示一下
if (safeNumber.trim().equals("")) {
Toast.makeText(PhoneBakActivity.this, "安全号码不能为空,请重新设置",
Toast.LENGTH_LONG).show();
return;
} else {
// 得到字符串的电话号码为1号线,对GSM手机MSISDN。。
String phoneNumber = telephonyManager.getLine1Number();
// IMSI可以区分SIM卡的标示
String subScribeerId = telephonyManager
.getSubscriberId();
// 保存手机号到数据文件中
Editor editor = sharedPreferences.edit();
editor.putString("safenumber", safeNumber);
isStart = true;
editor.putBoolean("start", isStart);
editor.putString("subscriberid", subScribeerId);
editor.commit();
// 设置激活状态为false
btn_modify.setEnabled(false);
et_safenumber.setEnabled(false);
btn_start.setText("停止防盗");
}
}
}
});
btn_modify.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 调用设置密码的dialog
showSetPasswordDialog();
}
});
}
/****
* 设置对话框的方法
*
* *
****/
private void showSetPasswordDialog() {
// 创建一个对话框
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 渲染器,进行对XML渲染成对象
LayoutInflater inflater = LayoutInflater.from(this);
// 把布局工具渲染出view对象
View view = inflater.inflate(R.layout.password, null);
// 实例化组件
final EditText et_username = (EditText) view
.findViewById(R.id.username);
final EditText et_password = (EditText) view
.findViewById(R.id.password);
Button btn_ok = (Button) view.findViewById(R.id.ok);
Button btn_cancle = (Button) view.findViewById(R.id.cancle);
// 对按钮设置监听时间
btn_ok.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 得到输入的用户名和密码
String username = et_username.getText().toString();
String password = et_password.getText().toString();
// 如果用户名和密码为空的时候
if (username.trim().equals("") || password.trim().equals("")) {
Toast.makeText(PhoneBakActivity.this, "用户名和密码不能为空",
Toast.LENGTH_LONG).show();
return;
}
// 获得编辑器
Editor editor = sharedPreferences.edit();
// 向编辑添加用户名和密码
editor.putString("username", username);
editor.putString("password", password);
// 改变first为flase
editor.putBoolean("first", false);
// 保存编辑好 的数据
editor.commit();
// 取消设置密码的dialog
setPasswordDialog.dismiss();
init();
}
});
btn_cancle.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (isFirst) {
// 退出
finish();
} else {
setPasswordDialog.dismiss();
}
}
});
// 是在标题
builder.setTitle("设置密码");
// 构造view对象
builder.setView(view);
// 创建和显示对话框
setPasswordDialog = builder.create();
setPasswordDialog.show();
}
}
4.接着看看开机的时候的处理bootReceiver.java获得开机后的广播事件
package com.wang;
import java.util.List;
import javax.net.ssl.ManagerFactoryParameters;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.telephony.TelephonyManager;
import android.telephony.SmsManager;
public class bootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获得保存 的数据
SharedPreferences sharedPreferences = context.getSharedPreferences(
"data", Context.MODE_WORLD_WRITEABLE);
TelephonyManager telephonyManager = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
//判断是否开始
boolean istart = sharedPreferences.getBoolean("start", false);
if (!istart) {
return;
} else {
//获得subscriberid ,safenumber ,subscriberid
String savesubscriberid = sharedPreferences.getString(
"savesubscriberid", "");
String safenumber = sharedPreferences.getString("safenumber", "");
//
String subscriberid = telephonyManager.getSubscriberId();
System.out.println(subscriberid);
//如果保存的savesubscriberid相同
if (subscriberid.trim().equals(savesubscriberid)) {
return;
} else {
//获得smsManager对象,可拥有超空断线的权限
SmsManager smsManager = SmsManager.getDefault();
//list保存长的分条短信
List<String> message = smsManager.divideMessage("手机的IMSI码为:"
+ savesubscriberid + "的手机,SIM卡已被替换,更换IMSI码为:"
+ subscriberid);
for (String msg : message) {
smsManager.sendTextMessage(safenumber, null, msg, null,
null);
}
}
}
}
}
5.接着看发送短信的实现SMSReceiver.java
package com.wang;
import java.util.List;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 获得保存 的数据
SharedPreferences sharedPreferences = context.getSharedPreferences(
"data", Context.MODE_WORLD_WRITEABLE);
boolean isstart = sharedPreferences.getBoolean("start", false);
// 获得保存的savephonenumber电话号码
String savephonenumber = sharedPreferences.getString("safenumber", "");
// 判断是否开始
if (isstart) {
// 获得短信的pdus格式,并转成object类
Object[] objects = (Object[]) intent.getSerializableExtra("pdus");
// 一条短信的一个byte【】的的数组,多条就是二维的
byte[][] puds = new byte[objects.length][];
//
for (int i = 0; i < puds.length; i++) {
puds[i] = (byte[]) objects[i];
}
// 每一条短信对象
SmsMessage[] message = new SmsMessage[objects.length];
for (int i = 0; i < puds.length; i++) {
// 创建一个SmsMessage从原始PDU。
message[i] = SmsMessage.createFromPdu(puds[i]);
}
for (int i = 0; i < message.length; i++) {
// dd得到短信的地址号码
String Address = message[i].getDisplayOriginatingAddress();
// 如果保存的电话号码相同的时候
if (Address.trim().equals(savephonenumber)) {
// d得到短信的内容
String body = message[i].getDisplayMessageBody();
// 如果短信包含的内容是试探的信息
if (body.contains(" affernoon good")) {
// 管理短讯服务,
SmsManager smsManager = SmsManager.getDefault();
// 分条发送短息
List<String> message1 = smsManager
.divideMessage("你捡到了我的手机,请归还,联系方式:0000000000000");
for (String msg : message1) {
// 发送短信到savephonenumber
smsManager.sendTextMessage(savephonenumber, null,
msg, null, null);
}
}
}
}
}
}
}
6.亲,别忘了添加权限和注册服务哦!!
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wang"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".PhoneBakActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 广播服务注册 发送短信的服务 -->
<receiver android:name=".SMSReceiver" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<!-- 广播服务注册开机的广播android.intent.action.BOOT_COMPLETED开机启动的广播事件-->
<receiver android:name=".bootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
<!-- 1,接受短信的权限 ,2,读取手机状态的权限 3.发送短信的权限-->
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.SEND_SMS" >
</uses-permission>
</manifest>
7.然后呢,就可以看到运行结果咯,运行结果如下:第一张图片是第一次使用时候设置用户名和密码,第二张是向另一个自己的手机,发送丢失手机的信息
第三张是点击开始防盗是时候的时间,第四张是点击修改密码的时候的事件