手机防盗软件的实现

                     

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

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






posted @   程序员Android的博客  阅读(121)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示