閱讀137 返回首頁    go 阿裏雲 go 技術社區[雲棲]


手機衛士10-手機被盜後定位實現


好啦,廢話不多說,我們進入主題,今天我們要繼續上一次講的,就是手機被盜之後,獲得手機所在的位置。

上一次,我們說到了,如果我們的sim卡被人換掉了,那麼就會發送一條短信到我們的原來設定的安全號碼那裏的,而今天,我們就要獲取到手機的位置啦,以便追蹤回手機。

我們是這樣設計的,我們通過發送一條短信,短信的內容就是一些要執行的操作的指令(比如說#*location*#),我們就在軟件裏麵加入一個短信的廣播,攔截到短信,然後分析是什麼指令,然後就執行對應的操作,就像#*location*#這條指令一樣,我們就可以理解為獲取手機的位置。


所以我們要先新建一個類,用來提供手機的位置信息的

com.xiaobin.security.engine.GPSInfoProvider

  1. package com.xiaobin.security.engine;

  2. import android.content.Context;
  3. import android.content.SharedPreferences;
  4. import android.content.SharedPreferences.Editor;
  5. import android.location.Criteria;
  6. import android.location.Location;
  7. import android.location.LocationListener;
  8. import android.location.LocationManager;
  9. import android.os.Bundle;

  10. /**
  11. * 這個類,我們要做成了單例模式,因為手機裏麵隻有一個gps所以免得每次都新開一個對象
  12. * @author Administrator
  13. *
  14. */
  15. public class GPSInfoProvider
  16. {
  17.         private static GPSInfoProvider gpsInfoProvider;
  18.         private static Context context;
  19.         private static MyLocationListener listener;
  20.         private LocationManager locationManager;
  21.         
  22.         private GPSInfoProvider()
  23.         {
  24.                 
  25.         }
  26.         
  27.         /**
  28.          * 為了讓這個方法一定執行完,所以我們加入了synchronized來修飾
  29.          * @return
  30.          */
  31.         public static synchronized GPSInfoProvider getInstance(Context context)
  32.         {
  33.                 if(gpsInfoProvider == null)
  34.                 {
  35.                         gpsInfoProvider = new GPSInfoProvider();
  36.                         GPSInfoProvider.context = context;
  37.                 }
  38.                 return gpsInfoProvider;
  39.         }
  40.         
  41.         public String getLocation()
  42.         {
  43.                 locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
  44.                 
  45.                 String provider = getBestProvider();
  46.                 
  47.                 //這個方法是位置更新的的操作,有四個參數
  48.                 //第一個參數就是使用的定位設備啊,如gps,基站定位啊
  49.                 //第二個參數就是多長時間更新一次定位信息,太頻繁了會很耗電,根據自己程序的實際需要來進行確定
  50.                 //第三個參數就是用戶位移了多少米之後,就重新獲取一次定位信息,太頻繁了會很耗電,根據自己程序的實際需要來進行確定
  51.                 //最後一個參數就是在位置發生變化的回調方法
  52.                 locationManager.requestLocationUpdates(provider, 60000, 50, getListener());
  53.                 //locationManager.getAllProviders();//它會把所以支持的定位方式都打列出來,這樣就可以知道手機所支持的定位啦
  54.                 
  55.                 SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
  56.                 String location = sp.getString("lostLocation", "");
  57.                 return location;
  58.         }
  59.         
  60.         //停止gps
  61.         public void stopGPSListener()
  62.         {
  63.                 if(locationManager != null)
  64.                 {
  65.                         locationManager.removeUpdates(getListener());
  66.                 }
  67.         }
  68.         
  69.         private String getBestProvider()
  70.         {
  71.                 Criteria criteria = new Criteria();
  72.                 //這個是定義它的定位精度的
  73.                 //Criteria.ACCURACY_COARSE  這個是一般的定位
  74.                 //Criteria.ACCURACY_FINE  這個是精準定位
  75.                 criteria.setAccuracy(Criteria.ACCURACY_FINE);
  76.                 
  77.                 //設置是不是對海拔敏感的
  78.                 criteria.setAltitudeRequired(false);
  79.                 
  80.                 //設置對手機的耗電量,定位要求越高,越耗電
  81.                 criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
  82.                 
  83.                 //設置對速度變化是不是敏感
  84.                 criteria.setSpeedRequired(true);
  85.                 
  86.                 //設置在定位時,是不是允許與運營商交換數據的開銷
  87.                 criteria.setCostAllowed(true);
  88.                 
  89.                 //這個方法是用來得到最好的定位方式的,它有兩個參數,一個是Criteria(類似於Map集合),就是一些條件,比如說對加速度敏感啊,什麼海拔敏感這些的
  90.                 //第二個參數就是,如果我們置為false,那麼我們得到的也有可能是已經關掉了的設備,如果是true那麼,就隻會得到已經打開了的設備
  91.                 return locationManager.getBestProvider(criteria, true);
  92.         }
  93.         
  94.         //做成單例模式
  95.         private synchronized MyLocationListener getListener()
  96.         {
  97.                 if(listener == null)
  98.                 {
  99.                         listener = new MyLocationListener();
  100.                 }
  101.                 return listener;
  102.         }
  103.         
  104.         //=========================================================================
  105.         
  106.         private class MyLocationListener implements LocationListener
  107.         {

  108.                 @Override
  109.                 public void onLocationChanged(Location location)
  110.                 {
  111.                         //手機位置發生改變時調用的方法
  112.                         String latitude = "緯度:" + location.getLatitude();//緯度
  113.                         String longitude = "經度:" + location.getLongitude();//經度
  114.                         SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
  115.                         Editor editor = sp.edit();
  116.                         editor.putString("lastLocation", latitude + " - " + longitude);
  117.                         editor.commit();
  118.                 }

  119.                 @Override
  120.                 public void onStatusChanged(String provider, int status, Bundle extras)
  121.                 {
  122.                         //定位設備的狀態發生改變的時候調用的方法,比如說用戶把設備打開,或關閉,第二個參數就是設備的狀態啦
  123.                 }

  124.                 @Override
  125.                 public void onProviderEnabled(String provider)
  126.                 {
  127.                         //設備打開的時候調用的方法
  128.                 }

  129.                 @Override
  130.                 public void onProviderDisabled(String provider)
  131.                 {
  132.                         //設備關閉的時候調用的方法
  133.                 }
  134.                 
  135.         }

  136. }
複製代碼
然後呢,我們就要開啟一個廣播接收者啦,一但攔截到我們發的短信,那麼就進行指令的分析還有相應的處理
所以我們新建一個廣播接收者com.xiaobin.security.receiver.SmsReceiver
  1. package com.xiaobin.security.receiver;

  2. import com.xiaobin.security.engine.GPSInfoProvider;

  3. import android.content.BroadcastReceiver;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.telephony.SmsManager;
  7. import android.telephony.SmsMessage;

  8. public class SmsReceiver extends BroadcastReceiver
  9. {

  10.         @Override
  11.         public void onReceive(Context context, Intent intent)
  12.         {
  13.                 Object[] pdus = (Object[]) intent.getExtras().get("pdus");
  14.                 for(Object pdu : pdus)
  15.                 {
  16.                         SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
  17.                         //拿到短信內容
  18.                         String content = smsMessage.getMessageBody();
  19.                         //拿到發送人的電話號碼
  20.                         String sender = smsMessage.getOriginatingAddress();
  21.                         
  22.                         //這個是通過短信發送指令,然後進行一些操作的
  23.                         if(content.equals("#*location*#"))
  24.                         {
  25.                                 abortBroadcast();//終止廣播,免得讓小偷看到短信
  26.                                 GPSInfoProvider gpsInfoProvider = GPSInfoProvider.getInstance(context);
  27.                                 String location = gpsInfoProvider.getLocation();
  28.                                 System.out.println(location);
  29.                                 if(!location.equals(""))
  30.                                 {
  31.                                         //發送短信
  32.                                         SmsManager smsManager = SmsManager.getDefault();
  33.                                         smsManager.sendTextMessage(sender, null, location, null, null);
  34.                                 }
  35.                         }
  36.                 }
  37.         }

  38. }
複製代碼
上麵獲取短信的代碼可能大家有點疑問了,為什麼會是pdus,這個的話,我們就可以下載一下Android自己寫好了的短信管理器的代碼啦,我們可以下載一下它的源碼來看一下,Android源碼下載的方法我們之前說過的啦!去看一下,就可以知道為什麼的啦。大家可以搜一下sms就可以找到的啦,然後下來來看看吧。好啦,從上麵的代碼也可以看到,我們拿到了那條指令短信,然後,就獲取位置,然後再發回給我們的手機,而且也把廣播終止啦,這樣,小偷就不會知道我們把短信發送到手機上啦,這樣我們就可以瞞過小偷,進行一些操作啦,我們還可以定義多一些指令,比如說,刪除東西的指令啦,格式化的指令啦,亂發東西的指令啦,都可以的,我們看一下有沒有空,盡量寫多一些功能!好啦,現在廣播接收者就寫好啦,我們也要在AndroidMainfest裏麵注冊它啦
  1. <receiver 
  2.             android:name="com.xiaobin.security.receiver.SmsReceiver">
  3.             <intent-filter android:priority="1000">
  4.                 <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  5.             </intent-filter>
  6.         </receiver>
複製代碼
還要加入相應的權限呢
  1.     <uses-permission android:name="android.permission.RECEIVE_SMS"/>
  2.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  3.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  4.     <!-- 這個是用模擬器進行測試才需要用到的權限,表示是這個模擬的位置 -->
  5.     <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
複製代碼
注意,模擬器2.3的Android版本的gps是有問題的,所以如果用模擬器測試的話,那麼你就不要用2.3的模擬器啦

好啦,再說一點,我們拿到的是手機的經度可緯度,隻要我們在穀歌地圖那裏查一下,就可以得到在那裏的啦,我們明天就會繼續完善我們的指令的,加入鎖屏還有恢複到出廠模式,和播放報警音樂!




好啦,今天就講到這裏,下一次,我們再繼續

 Security_10GPS定位與發送短信指令 (1).rar (1.61 MB, 下載次數: 301) 

最後更新:2017-04-03 12:53:36

  上一篇:go 劍指Offer之二叉樹的深度
  下一篇:go 在iOS上present一個半透明的viewController