最新實戰教程,讓你瞭解Android自動化刷量、作弊與防作弊的那些事,案例:刷友盟統計、批量註冊蘋果帳號
由於週末有點事,所以沒來得及繼續更新我們的這個項目,今天終於有時間寫一下啦。
好啦,廢話不多說,我們進入主題,今天我們要繼續上一次講的,就是手機被盜之後,獲得手機所在的位置。
上一次,我們說到了,如果我們的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的模擬器啦
好啦,再說一點,我們拿到的是手機的經度可緯度,只要我們在谷歌地圖那裏查一下,就可以得到在那裏的啦,我們明天就會繼續完善我們的指令的,加入鎖屏還有恢復到出廠模式,和播放報警音樂!
好啦,今天就講到這裏,下一次,我們再繼續