手机防盗软件的实现

                     

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.然后呢,就可以看到运行结果咯,运行结果如下:第一张图片是第一次使用时候设置用户名和密码,第二张是向另一个自己的手机,发送丢失手机的信息

第三张是点击开始防盗是时候的时间,第四张是点击修改密码的时候的事件






  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
http://blog.csdn.net/xiaoxiao108/archive/2011/05/01/6381414.aspx 前段时间母亲手机遭贼了,以防万一,如果自己手机丢了,肯定会更郁闷,记得很多手机防盗功能,如果更换了sim卡就会,手机就会自动把新的 sim卡手机号,gps坐标,什么的发送到绑定的手机上。网上查了下资料,这类这类软件也挺多的。看了看功能也不是很复杂,就自己写了个玩玩 。 开发环境 vs2008 wm6 .net cf 3.5 编译运行代码时,电脑必须安装 Windows Mobile 6 Professional SDK Refresh.msi 实现方法很简单 1.每一个sim都有唯一的一个IMSI编号,可以根据IMSI编号来判断手机是否更换sim卡 2.如果检测到IMSI不是自己的sim卡的,可以确定其他人可能在用你的手机。 3.每次开机程序自动运行,检测到别人如果使用你的手机,自动把他的通话记录,跟gps坐标发送到绑定好的手机号上。 4.知道用你手机人的手机号,最近通话记录,gps坐标后,再自己想办法找到这人吧。 具体代码 1.取sim卡IMSI编号 使用 TapiLib.dll类库中的ControlTapi.GetIMSINumber()取到sim卡imsi编号 2.判断是不是自己的sim卡 string simStr=ControlTapi.GetIMSINumber(); if (simStr.Length != 0) { if (simStr != SIM) { 其中SIM为事先取好的自己手机卡的IMSI编号 3.取最近通话记录代码 [StructLayout(LayoutKind.Sequential)] public struct CALLLOGENTRY { public UInt32 cbSize; public UInt64 ftStartTime; public UInt64 ftEndTime; public short iom; public bool fOutgoing; public bool fConnected; public bool fEnded; public bool fRoam; public short cidt; public IntPtr pszNumber; public IntPtr pszName; public IntPtr pszNameType; public IntPtr pszNote; }; [DllImport("phone.dll", EntryPoint = "PhoneOpenCallLog", SetLastError = true)] //首先要PhoneOpenCallLog打开通话记录句柄 private static extern int PhoneOpenCallLog(ref IntPtr pHandle); [DllImport("phone.dll", EntryPoint = "PhoneCloseCallLog", SetLastError = true)] //要调用PhoneCloseCallLog关闭句柄 private static extern int PhoneCloseCallLog(IntPtr pHandle); [DllImport("phone.dll", EntryPoint = "PhoneGetCallLogEntry", SetLastError = true)] private static extern int PhoneGetCallLogEntry(IntPtr pHandke, ref CALLLOGENTRY pEntry); //用PhoneGetCallLogEntry方法会返回一个通话记录结构,在该结构中,包含号码、姓名、通话开始时间、通话结束时间等信息。 private string GetLog() { string CallInfo = ""; try { IntPtr handle = IntPtr.Zero; //句柄 CALLLOGENTRY entry = new CALLLOGENTRY(); PhoneOpenCallLog(ref handle); //首先要PhoneOpenCallLog打开通话记录句柄 entry.cbSize = (uint)Marshal.SizeOf(entry); //返回类的非托管大小 if (handle != IntPtr.Zero) { while (PhoneGetCallLogEntry(handle, ref entry) == 0) //获取通话记录 { //Marshal.PtrToStringUni 复制指定数目的字符 string phoneNumber = Marshal.PtrToStringUni(entry.pszNumber); //号码 string name = Marshal.PtrToStringUni(entry.pszName); //姓名 if (phoneNumber == null) { phoneNumber = string.Empty; } if (name == null) { name = string.Empty; } string temp = (phoneNumber.Trim() + name.Trim()); CallInfo = CallInfo + temp; } PhoneCloseCallLog(handle); if (CallInfo.Length < 140) { return CallInfo; } else { return CallInfo.Substring(0,140); } } else { int error = Marshal.GetLastWin32Error(); return ""; } } catch (Exception ep) { //MessageBox.Show(ep.ToString()); return ""; } finally { } } 4.取gps坐标代码 GpsDeviceState device = null; GpsPosition position = null; Gps gps = new Gps(); void gps_DeviceStateChanged(object sender, DeviceStateChangedEventArgs args) { device = args.DeviceState; } protected void gps_LocationChanged(object sender, LocationChangedEventArgs args) { position = args.Position; str = ""; if (position != null) { //维度 if (position.LatitudeValid) { str += position.Latitude; } //经度 if (position.LongitudeValid) { str += " " + position.Longitude; 5.发送短信代码 SmsMessage msg = new SmsMessage(PHONE, str); msg.Send(); 6.打包为开机启动程序 打包cab文件时,只需把快捷方式添加到Startup文件夹下面就ok。 不足之处。 1.gps代码根据sdk中修改的,只是卫星定位的,根据基站定位的代码不知如何实现,只有当使用手机的人走到卫星信号好的地方时才能把坐标发 出去 2.发送的gps坐标 ,只是一个大体的位置,几百米以内的范围,有些浮动 3.如果手机被恢复出厂设置,或者被刷机,程序肯定不能运行了 即使gps信号不好的情况下只是得到使用手机人的电话号码,跟通话记录,用处也是挺大的。代码只是写着玩的,提供下参考思路代码 如果你发现有什么不合理的,需要改进的地方,或者你有什么更好的实现方法联系328452421@qq.com 朱晓 (泰山学院)。相互交流 谢谢 http://blog.csdn.net/xiaoxiao108/archive/2011/05/01/6381414.aspx
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值