Android項目實戰--手機衛士10--GPS定位與發送短信指令



最新實戰教程,讓你瞭解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的模擬器啦
 
好啦,再說一點,我們拿到的是手機的經度可緯度,只要我們在谷歌地圖那裏查一下,就可以得到在那裏的啦,我們明天就會繼續完善我們的指令的,加入鎖屏還有恢復到出廠模式,和播放報警音樂!




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


今天源碼下載









發佈了47 篇原創文章 · 獲贊 112 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章