天天看點

Android項目:手機安全衛士(7)—— 手機防盜功能Android項目:手機安全衛士(7)—— 手機防盜功能

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