小白马卫士项目总结之防盗功能的实现

sim卡更换报警功能:



此功能的实现原理是这样的,在点击sim卡时,程序会获取本机手机卡的卡串号,然后把它存储起来,然后当你的手机丢了的时候,你会通过手机上的安全号码发短信给你的手机,然后程序会再一次或许本机上的卡串号,如果与之前的卡串号不一致的话,那就给这个安全号码发送短信,提示卡换了!当然这个得话,你得用广播进行接收安全号码发过来的短信!而且这个广播的类型是系统自启动就开了,而且通过广播还得重启一个服务,如果手机丢的话,你可以发送短信,让这个服务帮你擦除数据!

首先得在mainfest.xml里面配置广播与服务:

1、配置广播:

<receiver android:name=".receiver.BootCompleteReceiver">
             <intent-filter android:priority="1000">
    	        <action android:name="android.intent.action.BOOT_COMPLETED" />
    	    </intent-filter>
        </receiver>
  
         <receiver android:name=".receiver.SmsReceiver">
             <intent-filter android:priority="1000">
    	        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    	    </intent-filter>
        </receiver>

注意:这里是两个广播,第一个广播主要是sim卡的报警处理的而且里面还启动了一个服务是拦截设置在黑名单里的电话与短信的!所以还得要两个广播和一个服务的类:

BootCompleteReceiver.java:
</pre><p><pre name="code" class="java">package cn.cbd.mobilesafe.activity.receiver;

import cn.cbd.mobilesafe.activity.MainActivity;
import cn.cbd.mobilesafe.activity.R;
import cn.cbd.mobilesafe.activity.service.BlackNumberSmsService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.sax.StartElementListener;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.util.Log;


public class BootCompleteReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		
		Intent intent1=new Intent(context,BlackNumberSmsService.class);
		context.startService(intent1);
		Log.i("BootCompleteReceiver","进入广播");
		
		
		//得到消息管理器
		NotificationManager nm=(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
		//创建一个新消息
		Notification notification=new Notification(R.drawable.notification, "手机卫士", System.currentTimeMillis());
		notification.flags=Notification.FLAG_NO_CLEAR;
		Intent intents=new Intent(context,MainActivity.class);
		intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		PendingIntent contentIntent=PendingIntent.getActivity(context, 0, intents,PendingIntent.FLAG_UPDATE_CURRENT);
		//设置消息的点击事件
		notification.setLatestEventInfo(context, "小白马卫士", "保护你的手机安全", contentIntent);
		//显示消息
		nm.notify(0, notification);
		
		
		//检查手机防盗是否处于开启状态
				SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
				boolean protecting = sp.getBoolean("protecting", false);
				//如果防盗处于开启状态
				if(protecting)
				{
					//检查sim卡是否发生变化.
					TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
					//获取当前手机里面的sim卡串号
					String currentSimSerialNumber = tm.getSimSerialNumber();
					String simSerialNumber = sp.getString("simSerialNumber", "");
					Log.i("BootCompleteReceiver","currentSimSerialNumber="+currentSimSerialNumber);
					Log.i("BootCompleteReceiver","simSerialNumber="+simSerialNumber);
					if(!currentSimSerialNumber.equals(simSerialNumber))
					{
						//sim被更换了.发短信通知机主
						SmsManager manager = SmsManager.getDefault();
						String safeMobleNumber = sp.getString("safeMobleNumber", "");
						manager.sendTextMessage(safeMobleNumber, null, "sim changed", null, null);
					}
						
				}

	}

}

SmsReceiver.java:

package cn.cbd.mobilesafe.activity.receiver;

import cn.cbd.mobilesafe.activity.R;
import cn.cbd.mobilesafe.activity.engine.GPSInfoProvider;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;

import android.text.TextUtils;
import android.util.Log;

public class SmsReceiver extends BroadcastReceiver {

	private static final String TAG="SMSRecevier";
	@Override
	public void onReceive(Context context, Intent intent) {
		Log.i(TAG,"start SMS");
		
		Object[] obj=(Object[]) intent.getExtras().get("pdus");
		for(Object o : obj)
		{
			SmsMessage smsMessage=SmsMessage.createFromPdu((byte[])o);
			//发信人的后机号,应该在此判断发信人的手机号是否与安全号码匹配
			String number=smsMessage.getOriginatingAddress();
			String body=smsMessage.getMessageBody().trim();
			//判断短信内容是否是#*localtion*#
			if("#*location*#".equals(body))
			{
				Log.i(TAG,"返回手机位置");
				String location=GPSInfoProvider.getInstance(context).getLoaction();
				Log.i(TAG, location);
				if(!TextUtils.isEmpty(location))
				{
					SmsManager manager=SmsManager.getDefault();
					manager.sendTextMessage(number, null, location, null, null);
				}
				abortBroadcast();
			}else if("#*alarm*#".equals(body)){
				
				Log.i(TAG,"播放报警音乐");
				
				MediaPlayer mediaPlayer=MediaPlayer.create(context,R.raw.ylzs);
				mediaPlayer.setVolume(1.0f, 1.0f);
				//mediaPlayer.setLooping(true);
				mediaPlayer.start();
				abortBroadcast();
			}else if("#*wipedata*#".equals(body)){
				
				Log.i(TAG,"清楚数据");
				DevicePolicyManager dm = (DevicePolicyManager) context
						.getSystemService(Context.DEVICE_POLICY_SERVICE);
				ComponentName mDeviceAdminSample = new ComponentName(context,
						MyAdmin.class);
				if (dm.isAdminActive(mDeviceAdminSample)) {
					dm.wipeData(0);
				}
				abortBroadcast();
			}else if ("#*lockscreen*#".equals(body)) {
				Log.i(TAG, "远程锁屏");
				DevicePolicyManager dm = (DevicePolicyManager) context
						.getSystemService(Context.DEVICE_POLICY_SERVICE);
				ComponentName mDeviceAdminSample = new ComponentName(context,
						MyAdmin.class);
				if (dm.isAdminActive(mDeviceAdminSample)) {
					dm.resetPassword("5211314", 0);
					dm.lockNow();
				}
				abortBroadcast();
			}
			
		}
		
		

	}

}

2、配置服务:

<service android:name="cn.cbd.mobilesafe.activity.service.BlackNumberSmsService"></service>

BlackNumberSmsService.java:
package cn.cbd.mobilesafe.activity.service;

import java.lang.reflect.Method;

import com.android.internal.telephony.ITelephony;

import cn.cbd.mobilesafe.activity.db.dao.BlackNumberDao;
import cn.cbd.mobilesafe.activity.receiver.BlackNumberSmsReceiver;
import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class BlackNumberSmsService  extends Service{

	private BlackNumberSmsReceiver blackNumberSmsReceiver;
	private TelephonyManager tm;
	private BlackNumberDao blackNumberDao;
	private MyListener listener;
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	
	@Override
	public void onCreate() {
		
		blackNumberSmsReceiver=new BlackNumberSmsReceiver();
		IntentFilter filter=new IntentFilter();
		//filter.setPriority(1000);
		filter.setPriority(Integer.MAX_VALUE);
		filter.addAction("android.provider.Telephony.SMS_RECEIVED");
		registerReceiver(blackNumberSmsReceiver, filter);
		
		blackNumberDao=new BlackNumberDao(this);
		
		
		
		
		tm=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
		listener=new MyListener();
		tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
		super.onCreate();
	}
	
	@Override
	public void onDestroy() {
		unregisterReceiver(blackNumberSmsReceiver);
		blackNumberSmsReceiver=null;
		tm.listen(listener, PhoneStateListener.LISTEN_NONE);
		listener=null;
		super.onDestroy();
	}
	
	private class MyListener extends PhoneStateListener
	{

		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			
			switch(state)
			{
			    case TelephonyManager.CALL_STATE_RINGING :
			    	
			    	
			    	  int code=blackNumberDao.findByMode(incomingNumber);
			    	  if(code==0 || code==2)
			    	  {
			    		  endcall();
			    		  //删除呼叫记录
			    		//呼叫记录不是立刻产生的. 而是等待一段时间后才产生
							//移除呼叫记录. 观察呼叫记录是否产生了如果产生了 再去移除.
			    		  Uri uri = Uri.parse("content://call_log/calls");
			    		  getContentResolver().registerContentObserver(uri, true, new MyObserver(new Handler(),incomingNumber));
			    	  }
			    	
			}
			super.onCallStateChanged(state, incomingNumber);
		}
		
	}
	
	private class MyObserver extends ContentObserver{
		String incomingNumber ;
		public MyObserver(Handler handler,String incomingNumber ) {
			super(handler);
			this.incomingNumber = incomingNumber;
		}
		//当观察的路径对应的内容发生改变的时候调用的方法.
		@Override
		public void onChange(boolean selfChange) {
			deleteCallLog(incomingNumber);
			//取消内容观察者的观察
			getContentResolver().unregisterContentObserver(this);
			super.onChange(selfChange);
		}
		
	}

	public void endcall() {
		
		try
		{
			
			Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
			IBinder binder = (IBinder)method.invoke(null, new Object[]{TELEPHONY_SERVICE});
			ITelephony.Stub.asInterface(binder).endCall();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
	}

	public void deleteCallLog(String incomingNumber) {
		
		Uri uri = Uri.parse("content://call_log/calls");
		Cursor cursor = getContentResolver().query(uri, new String[]{"_id"}, "number=?", new String[]{incomingNumber}, null);
		while(cursor.moveToNext()){
			String id = cursor.getString(0);
			getContentResolver().delete(uri, "_id=?", new String[]{id});
		}
		cursor.close();
		
	}

}

至于那个远程锁屏,远程擦除数据,播放报警音乐等等功能,在SmsReceiver.java类里面有详细的代码!其实这些功能的实现就是通过设置的那个安全号码,来给手机发送短信的!然后就用广播进行拦截,如果拦截到的内容与程序里面给功能设置的提示内容一样的话,就进行播放音乐,或者远程锁屏,或者擦除数据等!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章