手机防盗软件的兑现
手机防盗软件的实现
3.看看主活动是实现的过程PhoneBakActivity.java
7.然后呢,就可以看到运行结果咯,运行结果如下:第一张图片是第一次使用时候设置用户名和密码,第二张是向另一个自己的手机,发送丢失手机的信息
暑假第三十五天,今天学习的是手机防盗软件的实现过程,感觉这个软件也挺不错的,所以拿出来和大家一块分享一下,其实通过本程序你可以学到,如何注册一个账号,还有广播时间,发送短信等功能,嗯,最近呢,表示对电脑很烦,每天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.然后呢,就可以看到运行结果咯,运行结果如下:第一张图片是第一次使用时候设置用户名和密码,第二张是向另一个自己的手机,发送丢失手机的信息
第三张是点击开始防盗是时候的时间,第四张是点击修改密码的时候的事件