小白馬衛士項目總結之防盜功能的實現

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類裏面有詳細的代碼!其實這些功能的實現就是通過設置的那個安全號碼,來給手機發送短信的!然後就用廣播進行攔截,如果攔截到的內容與程序裏面給功能設置的提示內容一樣的話,就進行播放音樂,或者遠程鎖屏,或者擦除數據等!

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