防盗软件基础知识

本文为他人写的一个软件,感觉对初学者有一定参考意义,所以就顺便摘上来了:

先是说需要用到技术:

手机防盗软件:
运用到得知识点:
1.SharedPreference
  用于保存用户的设置信息
  是否开启了防盗的功能
  保存安全号码
  保存用户当前SIM卡的信息
2.BroadcastReceuver
  实现开机检测
  检测接收短信
3.TelephonyManager
  获取SIM卡的信息
4.SmsManager
  发送短信
总结:
1.关于SharedPreference:
  在android平台下用于保存数据有三种方式:1.SQLite 2.SharedPreferences 3.File SharedPreferences是将数据保存在一个XML文件中

, 并且是以Map的形式保存,一个Key对应一个Value,但获取某一个Key的是否,都会有一个默认值,这个默认值是在xml不存在这个key值的是

否使用,
  a) 获得SharedPreferences: 获得SharedPreferences是通过上下文(Context)中的getSharedPreferences方法获得:SharedPreferences

sp = this.getSharedPreferences("data",MODE_WORLD_READABLE);第一个参数是指定xml文件的名字,当不存在的是否会创建它,第二个参

数是获得这个SharedPreferences的模式,一共有四种模式:MODE_APPEND MODE_PRIVATE MODE_WORLD_READABLE MODE_wORLD_WRITEABLE
  b) 从SharedPreferneces中取值: 通过sp.getXXX的方式可以获得对应key的值,在getXXX的时候,需要指定一个默认的值,当key值不存在

的时候使用
  c) 往SharedPreferences中设置:
     需要用到Editro: Editor editor = sp.edit();获得了Editor之后,才能对SharedPreferences进行写:editro.putXXX

("key",value);最后需要注意的一点是别忘了commit(); 
  e) Xml文件存放的位置位于data/data/包名/shared_prefs/xxx.xml
2.关于AlertDialog: 创建AlertDialog需要用到AlertDialog.Builder这个对象,对这个Builder做相应的设置.可以使用AlertDialog有不

同的展现: AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle("");
  a) 创建普通的AlertDialog:builder.setNegativeButton("xxx",new DialogInterface.OnClickListener(){public void onClick

(DialogInterface dialog,int which){...}});一共有三种Button;NegativeButton,PositiveButton,NeutralButton:这三种Button默认

的实现了点击之后消失AlertDialog
  b) 创建自定义布局的AlertDialog:需要一个布局文件,我们所需要做的就是将这个布局文件编程一个view对象,再将这个View对象设置

到Builder里面去,将布局文件变成一个View对象,需要用到LayoutInflater这个对象中的inflate方法,LayoutInflater.infalter =

LayoutInflater.from(this);View view = inflater.inflate(R.layout.showpassworddailog,null);之后再builder.setView(view)就可

以将自定义的布局文件放到Dialog里面去了,在这个自定义的布局文件中,我们也是可以取到里面定义的控件,通过view.findViewById()就

可以找到自定义布局文件中的相应控件,之后就可以设置或者做事件的监听:
AlertDialog dialog = builder.create();
dialog.show();

 

 

广播接收者,对接收短信进行监听,当手机接收到一条短信的时候,系统会发出一条广播,被广播接收者接收,别忘了要将这个广播接收者进

 

行注册,在onReceive方法中有一个参数intent,当拦截这条短信的时候,所有的短信信息都会封装在这个intent中,我们可以通过这个

 

Intent来获取短信信息

短信封装的形式:pdu

Object[] obj = (Object[])intent.getSerializableExtra("pdus");

一条短信就是一个SmsMessage对象,一个SmsMessage对象通过一个byte[]来创建,一个byte[]数组就是一个object对象.

Object[]

Object[0]:   存在的形式 byte[]          一条短信

Object[1]:

Object[2]:

Object[3]:

所以Object[] 对应着一个byte[][]的二维数组

byte[][] pdus = new byte[object.length][];

pdus[i] = (byte[])object[i];

SmsMessage message = SmsMessage.createFromPdu(pdus[i]);

获得来短信号码:

String oriAddress = msgs[i].getDisplayOriginatingAddress();

获得来短信的内容:

String body = msgs[i].getDisplayMessageBody();

完善:

将接收短信和发送短信改成后台操作,不在机子上有相关的显示

通过gps,发送的短信内容包含位置信息

 

源码:

package com.jsd.lostprevent;

 

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;

/**

 * 

 * @author jiangshide

 *

 */

public class LostPreventJsd extends Activity {

 

AlertDialog setPrasswordDialog;

AlertDialog showLoginDialog;

SharedPreferences sp;

EditText et_safenumber;

Button btn_start,btn_modify;

boolean isFirst;

boolean isStart;

TelephonyManager tm;

@Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);

 

        sp = this.getSharedPreferences("data", MODE_WORLD_READABLE);

        isFirst = sp.getBoolean("first", true);

        if(isFirst){

        showPasswordDialog();

        return;

        }else{

        showLoginDailog();//进入登陆对话框

        }

}

private void showLoginDailog() {

AlertDialog.Builder builder = new AlertDialog.Builder(this);

LayoutInflater inflater = LayoutInflater.from(this);

View view = inflater.inflate(R.layout.showpassworddialog, 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_cancel = (Button)view.findViewById(R.id.cancel);

btn_ok.setOnClickListener(new OnClickListener() {

@Override

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(LostPreventJsd.this, "用户或者密码不能为空!", 1).show();

return;

}

String savedUserName = sp.getString("userName", "");

String savedPassword = sp.getString("password", "");

if(userName.trim().equals(savedUserName) && password.trim().equals(savedPassword)){

init();

showLoginDialog.dismiss();

}else{

Toast.makeText(LostPreventJsd.this, "用户名或者密码错误!", 1).show();

return;

}

}

});

btn_cancel.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

finish();

}

});

builder.setTitle("请输入密码");

builder.setView(view);

showLoginDialog = builder.create();

showLoginDialog.show();

}

 

/**

*  show main page

*/

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 = sp.getString("safenumber", "");

et_safenumber.setText(savedNumber);//保存NUMBER

//当用户进入的时候,如果已经是开启防盗了的,这是我们需要把开启防盗与修改设为不可用,当用户为关闭防盗功能的时候,这是我们需要把开启防盗与修改密码的按钮设为可用

//需要使用SharedPreference,并通过一个boolean来进行判断

isStart = sp.getBoolean("start", false);

if(isStart){

et_safenumber.setEnabled(false);

btn_modify.setEnabled(false);

btn_start.setText("停止防盗");

}

btn_start.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if(isStart){

Editor editor = sp.edit();

editor.putBoolean("start", false);

editor.commit();

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(LostPreventJsd.this, "安全号码不能为空!请重新设置", 1).show();

return;

}else{

String phoneNumber = tm.getLine1Number();//大多数情况下为null值,因为真实的电话号码并没有写入到SIM卡中 

String subScriberId = tm.getSubscriberId();//用来区分每一张卡的唯一的标识:IMSI,注意:当手机开机时并不会将其电话号码保存进卡,而是IMSI只是一个码值用来区分卡

//当手机开机时就会发送一个IMSI码给手机运营商,然后运营商将其你的手机号码从数据库中查出来,然后再返回到你的手机,这样就获得了你的真实手机号码

Editor editor = sp.edit();

editor.putString("safenumber", safeNumber);

isStart = true;

editor.putBoolean("start", isStart);

editor.putString("subscriberid", subScriberId);

editor.commit();

btn_modify.setEnabled(false);

et_safenumber.setEnabled(false);

btn_start.setText("停止防盗");

}

}

}

});

btn_modify.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

showPasswordDialog();//修改密码 

}

});

}

private void showPasswordDialog(){

AlertDialog.Builder builder = new AlertDialog.Builder(this);

LayoutInflater inflater = LayoutInflater.from(this);//这是一个VIEW渲染器:将一个XML文件渲染成一个对象

View view = inflater.inflate(R.layout.showpassworddialog, null);//返回一个VIEW对象

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_cancel = (Button)view.findViewById(R.id.cancel);

btn_ok.setOnClickListener(new OnClickListener() {

@Override

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(LostPreventJsd.this, "用户或者密码不能为空", 1).show();

return;

}

Editor editor = sp.edit();//获得编辑器

editor.putString("userName", userName);

editor.putString("password", password);

editor.putBoolean("first", false);//重新设置密码后不需要弹出

editor.commit();

setPrasswordDialog.dismiss();

init();//在这里由于被设置为false就不会弹出对话框了

}

});

btn_cancel.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if(isFirst){

finish();

}else{

setPrasswordDialog.dismiss();

}

}

});

builder.setTitle("设置密码");

builder.setView(view);//把VIEW文件设置进去

setPrasswordDialog = builder.create();//返回一个Dialog对其初始化

setPrasswordDialog.show();

}

}

 

package com.jsd.lostprevent;

 

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.TelephonyManager;

 

/**

 * 处理开机启动完成时对某些数据的处理方式

 * @author jiangshide

 *

 */

public class BootCompleteReceiver extends BroadcastReceiver {

 

@Override

public void onReceive(Context context, Intent intent) {

SharedPreferences sp = context.getSharedPreferences("data", Context.MODE_WORLD_WRITEABLE);

TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

boolean isStart = sp.getBoolean("start", false);

if(!isStart){

return;

}else{

String saveSubScriberId = sp.getString("subscriberid", "");

String safenumber = sp.getString("safenumber", "");

String subScriberId = tm.getSubscriberId();

if(subScriberId.trim().equals(saveSubScriberId)){

return;

}else{

SmsManager sm = SmsManager.getDefault();

List<String> message = sm.divideMessage("手机IMSI码为:" + saveSubScriberId + "的手机,SIM卡已更换,更换的IMSI码为:" + subScriberId);

for(String msg : message){

sm.sendTextMessage(safenumber, null, msg, null, null);//当很长的字符串时可以按多次进行发送

}

}

}

}

 

}

package com.jsd.lostprevent;
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;
/**
 * 
 * @author jiangshide
 *
 */
public class SMSReceivedBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences sp = context.getSharedPreferences("data",Context.MODE_WORLD_WRITEABLE);
boolean isStart = sp.getBoolean("start", false);
String savedPhoneNumber = sp.getString("safenumber", "");
if(isStart){
Object[] object = (Object[]) intent.getSerializableExtra("pdus");
byte[][] pdus = new byte[object.length][];
for(int i=0;i<pdus.length;i++){
pdus[i] = (byte[])object[i];
}
SmsMessage[] msgs = new SmsMessage[object.length];
for(int i=0;i<pdus.length;i++){
msgs[i] = SmsMessage.createFromPdu(pdus[i]);
}
for(int i = 0;i<msgs.length;i++){
String oriAddress = msgs[i].getDisplayOriginatingAddress();
if(oriAddress.trim().equals(savedPhoneNumber)){
String body = msgs[i].getDisplayMessageBody();
if(body.contains("ilovedog")){
SmsManager manager = SmsManager.getDefault();
List<String> message = manager.divideMessage("your phone is mime");
for(String msg : message){
manager.sendTextMessage(savedPhoneNumber, null, msg, null, null);
}
}
}
}
}
}
}
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<EditText  
android:id="@+id/safenumber"
   android:layout_width="fill_parent" 
   android:layout_height="wrap_content" 
   android:text="请输入一个安全有效的手机号码"
   />
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始防盗"
android:layout_weight="1"
/>
<Button
android:id="@+id/modify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改密码"
android:layout_weight="1"
/>
</LinearLayout>    
</LinearLayout>
showpassworddialog.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<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:hint="请输入密码"
   android:password="true"
   />
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ok"
android:layout_weight="1"
/>
<Button
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="cancel"
android:layout_weight="1"
/>
</LinearLayout>        
</LinearLayout>
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.jsd.lostprevent"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".LostPreventJsd"
                  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=".BootComleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
<receiver android:name=".SMSReceivedBroadcastReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
    </application>
    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
</manifest>

你可能感兴趣的:(防盗软件基础知识)