Android項目:手機安全衛士(7)—— 手機防盜功能
1 介紹
前面已經将手機防盜的界面、業務代碼邏輯完成了,現在就是最後的功能實作了,手機防盜主要有這麼幾個功能:
- 短信:發送警報短信,接收指令短信
- 播放報警音樂
- 定位:GPS 定位
- Android 項目:手機安全衛士(1)—— 閃屏界面
- Android 項目:手機安全衛士(2)—— 版本更新
- Android 項目:手機安全衛士(3)—— 主界面布局
- Android 項目:手機安全衛士(4)—— 自定義(組合)控件、屬性
- Android 項目:手機安全衛士(5)—— 自定義彈窗
- Android 項目:手機安全衛士(6)—— 手機防盜設定向導
- Android 項目:手機安全衛士(6)—— 手機防盜設定向導(二)
項目源碼位址(實時更新):https://github.com/xwdoor/MobileSafe
2 發送與接收短信
在 BootCompleteReceiver 廣播中,如果檢測到 sim 卡發生變化,則向安全号碼發送報警短信,代碼如下:
//發送警報短信
SmsManager smsManager = SmsManager.getDefault();//短信管理器
String phone = PrefUtils.getString(BaseActivity.PREF_PHONE_NUMBER,"",context);
smsManager.sendTextMessage(phone,null,"SIM卡發生變化",null,null);
當然,别忘了添權重限哦:
<uses-permission android:name="android.permission.SEND_SMS"/>
能發送短信,就能夠接收到失主發送過來的指令短信,這個時候就要做短信攔截,首先建立一個廣播接收器:SmsReceiver,因為要攔截短信,可以在 AndroidManifest.xml 檔案中設定較高的優先級,如下所示:
<receiver
android:name=".receiver.SmsReceiver"
android:enabled="true">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
廣播接收到短信後,先進行解析,先轉換為 Object 數組,然後将數組中的每一個元素轉換為 byte 數組,以此建構 SmsMessage 對象,然後就可以擷取一些短信的資訊,如代碼所示,接收短信也是需要權限的哦:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
public class SmsReceiver extends BroadcastReceiver {
public SmsReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for (Object pdu:pdus){//短信超過140位元組,會分為多條短信發送
SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);
String address = sms.getOriginatingAddress();
String msg = sms.getMessageBody();
Log.i(BaseActivity.TAG_LOG,"address-->"+address+",msg-->"+msg);
if("#*alarm*#".equals(address)){
//報警指令
}
}
}
}
僅僅是這樣是不夠的,因為這裡隻是做了短信的接收與解析,并沒有實作攔截的功能,系統還是會提示收到了短信,需要判斷短信是否為特殊指令短信,然後再做出攔截操作:
if("#*alarm*#".equals(address)){
//報警指令
//播放報警音樂
//攔截短信
abortBroadcast();
}else if ("#*location*#".equals(address)){
//gps定位指令
//攔截短信
abortBroadcast();
}
3 播放警報音樂
當收到報警指令的短信時,這個時候就可以播放報警音樂,友善你找到這個小偷,當然啦,你要在附近才行,是以為了避免打草驚蛇,你應該用 GPS 定位後,來到他的附近,再發送警報指令。讓我們來看看,它是怎麼警報的:
//播放報警音樂
MediaPlayer player = MediaPlayer.create(context, R.raw.ylzs);
player.setVolume(,);//音量最大
player.setLooping(true);//循環播放
player.start();//開始播放
4 GPS 定位
要想找回丢失的手機,定位是必不可少的功能,現在的手機大都支援 A-GPS 定位,寫到這裡,先來說說定位的幾種方法:
- 網絡定位:通過 IP 位址定位
- 基站定位:營運商的電話信号基站定位
- GPS 定位:美國的一套定位系統,中國的最好的就是北鬥了
- A-GPS 定位:輔助衛星定位,網絡 + GPS 綜合定位
大概就是這麼幾種,我們這裡采用網絡 + GPS 綜合定位,先建立一個服務:LocationService,用于擷取定位,代碼如下:
public class LocationService extends Service {
private LocationManager mLM;
private MyLocationListener mListener;
public LocationService() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mLM = (LocationManager) getSystemService(LOCATION_SERVICE);
mListener = new MyLocationListener();
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);//擷取良好精度
criteria.setCostAllowed(true);//允許流量消耗(花費、花錢)
String bestProvider = mLM.getBestProvider(criteria, true);// 擷取目前最好的位置提供者
mLM.requestLocationUpdates(bestProvider,,, mListener);
}
@Override
public void onDestroy() {
super.onDestroy();
mLM.removeUpdates(mListener);
}
class MyLocationListener implements LocationListener{
// 位置發生變化
@Override
public void onLocationChanged(Location location) {
String jLongitude = "j: "+location.getLongitude();//經度
String wLatitude = "w: "+location.getLatitude();//緯度
String phone = PrefUtils.getString(BaseActivity.PREF_PHONE_NUMBER,"",getApplicationContext());//擷取安全号碼
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phone,null,"Location-->"+jLongitude+";"+wLatitude,null,null);
stopSelf();//停止服務(service自殺的方法)
}
// 位置提供者狀态發生變化
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
// 定位開關開啟
@Override
public void onProviderEnabled(String provider) {
}
// 定位開關關閉
@Override
public void onProviderDisabled(String provider) {
}
}
}
通過 getSystemService() 方法擷取定位管理器,然後擷取目前最好的位置提供者,擷取到目前位置後,通過短信的形式發送給失主,之後就可以關閉定位服務了。每當手機收到定位指令的短信時,都需要開啟該服務。
當然,不要忘了添權重限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
和
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
5 總結
今天的東西還是很有用的,其實這些知識點并不需要記住,隻需要知道流程,有這麼一個方法即可。以上的代碼我暫時隻是在模拟器上測試過,沒有在真機上調試,不能包過,萬一有問題呢。
- Android 項目:手機安全衛士(1)—— 閃屏界面
- Android 項目:手機安全衛士(2)—— 版本更新
- Android 項目:手機安全衛士(3)—— 主界面布局
- Android 項目:手機安全衛士(4)—— 自定義(組合)控件、屬性
- Android 項目:手機安全衛士(5)—— 自定義彈窗
- Android 項目:手機安全衛士(6)—— 手機防盜設定向導
- Android 項目:手機安全衛士(6)—— 手機防盜設定向導(二)
項目源碼位址(實時更新):https://github.com/xwdoor/MobileSafe