好啦,廢話不多說,我們進入主題,今天我們要繼續上一次講的,就是手機被盜之後,獲得手機所在的位置。
上一次,我們說到了,如果我們的sim卡被人換掉了,那麼就會發送一條短信到我們的原來設定的安全號碼那裏的,而今天,我們就要獲取到手機的位置啦,以便追蹤回手機。
我們是這樣設計的,我們通過發送一條短信,短信的內容就是一些要執行的操作的指令(比如說#*location*#),我們就在軟件裏麵加入一個短信的廣播,攔截到短信,然後分析是什麼指令,然後就執行對應的操作,就像#*location*#這條指令一樣,我們就可以理解為獲取手機的位置。
所以我們要先新建一個類,用來提供手機的位置信息的
com.xiaobin.security.engine.GPSInfoProvider
-
package com.xiaobin.security.engine;
-
-
import android.content.Context;
-
import android.content.SharedPreferences;
-
import android.content.SharedPreferences.Editor;
-
import android.location.Criteria;
-
import android.location.Location;
-
import android.location.LocationListener;
-
import android.location.LocationManager;
-
import android.os.Bundle;
-
-
/**
-
* 這個類,我們要做成了單例模式,因為手機裏麵隻有一個gps所以免得每次都新開一個對象
-
* @author Administrator
-
*
-
*/
-
public class GPSInfoProvider
-
{
-
private static GPSInfoProvider gpsInfoProvider;
-
private static Context context;
-
private static MyLocationListener listener;
-
private LocationManager locationManager;
-
-
private GPSInfoProvider()
-
{
-
-
}
-
-
/**
-
* 為了讓這個方法一定執行完,所以我們加入了synchronized來修飾
-
* @return
-
*/
-
public static synchronized GPSInfoProvider getInstance(Context context)
-
{
-
if(gpsInfoProvider == null)
-
{
-
gpsInfoProvider = new GPSInfoProvider();
-
GPSInfoProvider.context = context;
-
}
-
return gpsInfoProvider;
-
}
-
-
public String getLocation()
-
{
-
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
-
-
String provider = getBestProvider();
-
-
//這個方法是位置更新的的操作,有四個參數
-
//第一個參數就是使用的定位設備啊,如gps,基站定位啊
-
//第二個參數就是多長時間更新一次定位信息,太頻繁了會很耗電,根據自己程序的實際需要來進行確定
-
//第三個參數就是用戶位移了多少米之後,就重新獲取一次定位信息,太頻繁了會很耗電,根據自己程序的實際需要來進行確定
-
//最後一個參數就是在位置發生變化的回調方法
-
locationManager.requestLocationUpdates(provider, 60000, 50, getListener());
-
//locationManager.getAllProviders();//它會把所以支持的定位方式都打列出來,這樣就可以知道手機所支持的定位啦
-
-
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
-
String location = sp.getString("lostLocation", "");
-
return location;
-
}
-
-
//停止gps
-
public void stopGPSListener()
-
{
-
if(locationManager != null)
-
{
-
locationManager.removeUpdates(getListener());
-
}
-
}
-
-
private String getBestProvider()
-
{
-
Criteria criteria = new Criteria();
-
//這個是定義它的定位精度的
-
//Criteria.ACCURACY_COARSE 這個是一般的定位
-
//Criteria.ACCURACY_FINE 這個是精準定位
-
criteria.setAccuracy(Criteria.ACCURACY_FINE);
-
-
//設置是不是對海拔敏感的
-
criteria.setAltitudeRequired(false);
-
-
//設置對手機的耗電量,定位要求越高,越耗電
-
criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
-
-
//設置對速度變化是不是敏感
-
criteria.setSpeedRequired(true);
-
-
//設置在定位時,是不是允許與運營商交換數據的開銷
-
criteria.setCostAllowed(true);
-
-
//這個方法是用來得到最好的定位方式的,它有兩個參數,一個是Criteria(類似於Map集合),就是一些條件,比如說對加速度敏感啊,什麼海拔敏感這些的
-
//第二個參數就是,如果我們置為false,那麼我們得到的也有可能是已經關掉了的設備,如果是true那麼,就隻會得到已經打開了的設備
-
return locationManager.getBestProvider(criteria, true);
-
}
-
-
//做成單例模式
-
private synchronized MyLocationListener getListener()
-
{
-
if(listener == null)
-
{
-
listener = new MyLocationListener();
-
}
-
return listener;
-
}
-
-
//=========================================================================
-
-
private class MyLocationListener implements LocationListener
-
{
-
-
@Override
-
public void onLocationChanged(Location location)
-
{
-
//手機位置發生改變時調用的方法
-
String latitude = "緯度:" + location.getLatitude();//緯度
-
String longitude = "經度:" + location.getLongitude();//經度
-
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
-
Editor editor = sp.edit();
-
editor.putString("lastLocation", latitude + " - " + longitude);
-
editor.commit();
-
}
-
-
@Override
-
public void onStatusChanged(String provider, int status, Bundle extras)
-
{
-
//定位設備的狀態發生改變的時候調用的方法,比如說用戶把設備打開,或關閉,第二個參數就是設備的狀態啦
-
}
-
-
@Override
-
public void onProviderEnabled(String provider)
-
{
-
//設備打開的時候調用的方法
-
}
-
-
@Override
-
public void onProviderDisabled(String provider)
-
{
-
//設備關閉的時候調用的方法
-
}
-
-
}
-
-
}
複製代碼
然後呢,我們就要開啟一個廣播接收者啦,一但攔截到我們發的短信,那麼就進行指令的分析還有相應的處理
所以我們新建一個廣播接收者com.xiaobin.security.receiver.SmsReceiver
-
package com.xiaobin.security.receiver;
-
-
import com.xiaobin.security.engine.GPSInfoProvider;
-
-
import android.content.BroadcastReceiver;
-
import android.content.Context;
-
import android.content.Intent;
-
import android.telephony.SmsManager;
-
import android.telephony.SmsMessage;
-
-
public class SmsReceiver extends BroadcastReceiver
-
{
-
-
@Override
-
public void onReceive(Context context, Intent intent)
-
{
-
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
-
for(Object pdu : pdus)
-
{
-
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
-
//拿到短信內容
-
String content = smsMessage.getMessageBody();
-
//拿到發送人的電話號碼
-
String sender = smsMessage.getOriginatingAddress();
-
-
//這個是通過短信發送指令,然後進行一些操作的
-
if(content.equals("#*location*#"))
-
{
-
abortBroadcast();//終止廣播,免得讓小偷看到短信
-
GPSInfoProvider gpsInfoProvider = GPSInfoProvider.getInstance(context);
-
String location = gpsInfoProvider.getLocation();
-
System.out.println(location);
-
if(!location.equals(""))
-
{
-
//發送短信
-
SmsManager smsManager = SmsManager.getDefault();
-
smsManager.sendTextMessage(sender, null, location, null, null);
-
}
-
}
-
}
-
}
-
-
}
複製代碼
上麵獲取短信的代碼可能大家有點疑問了,為什麼會是pdus,這個的話,我們就可以下載一下Android自己寫好了的短信管理器的代碼啦,我們可以下載一下它的源碼來看一下,Android源碼下載的方法我們之前說過的啦!去看一下,就可以知道為什麼的啦。大家可以搜一下sms就可以找到的啦,然後下來來看看吧。好啦,從上麵的代碼也可以看到,我們拿到了那條指令短信,然後,就獲取位置,然後再發回給我們的手機,而且也把廣播終止啦,這樣,小偷就不會知道我們把短信發送到手機上啦,這樣我們就可以瞞過小偷,進行一些操作啦,我們還可以定義多一些指令,比如說,刪除東西的指令啦,格式化的指令啦,亂發東西的指令啦,都可以的,我們看一下有沒有空,盡量寫多一些功能!好啦,現在廣播接收者就寫好啦,我們也要在AndroidMainfest裏麵注冊它啦
-
<receiver
-
android:name="com.xiaobin.security.receiver.SmsReceiver">
-
<intent-filter android:priority="1000">
-
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
-
</intent-filter>
-
</receiver>
複製代碼
還要加入相應的權限呢
-
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
-
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
-
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-
<!-- 這個是用模擬器進行測試才需要用到的權限,表示是這個模擬的位置 -->
-
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
複製代碼
注意,模擬器2.3的Android版本的gps是有問題的,所以如果用模擬器測試的話,那麼你就不要用2.3的模擬器啦
好啦,再說一點,我們拿到的是手機的經度可緯度,隻要我們在穀歌地圖那裏查一下,就可以得到在那裏的啦,我們明天就會繼續完善我們的指令的,加入鎖屏還有恢複到出廠模式,和播放報警音樂!
好啦,今天就講到這裏,下一次,我們再繼續
Security_10GPS定位與發送短信指令
(1).rar (1.61 MB, 下載次數: 301)
|