手机卫士10-手机被盗后定位实现

简介: <table cellspacing="0" cellpadding="0" style="word-wrap:break-word; empty-cells:show; border-collapse:collapse; table-layout:fixed; width:1119px; color:rgb(68,68,68); font-family:Tahoma,'Microsoft

好啦,废话不多说,我们进入主题,今天我们要继续上一次讲的,就是手机被盗之后,获得手机所在的位置。

上一次,我们说到了,如果我们的sim卡被人换掉了,那么就会发送一条短信到我们的原来设定的安全号码那里的,而今天,我们就要获取到手机的位置啦,以便追踪回手机。

我们是这样设计的,我们通过发送一条短信,短信的内容就是一些要执行的操作的指令(比如说#*location*#),我们就在软件里面加入一个短信的广播,拦截到短信,然后分析是什么指令,然后就执行对应的操作,就像#*location*#这条指令一样,我们就可以理解为获取手机的位置。


所以我们要先新建一个类,用来提供手机的位置信息的

com.xiaobin.security.engine.GPSInfoProvider

  1. package com.xiaobin.security.engine;

  2. import android.content.Context;
  3. import android.content.SharedPreferences;
  4. import android.content.SharedPreferences.Editor;
  5. import android.location.Criteria;
  6. import android.location.Location;
  7. import android.location.LocationListener;
  8. import android.location.LocationManager;
  9. import android.os.Bundle;

  10. /**
  11. * 这个类,我们要做成了单例模式,因为手机里面只有一个gps所以免得每次都新开一个对象
  12. * @author Administrator
  13. *
  14. */
  15. public class GPSInfoProvider
  16. {
  17.         private static GPSInfoProvider gpsInfoProvider;
  18.         private static Context context;
  19.         private static MyLocationListener listener;
  20.         private LocationManager locationManager;
  21.         
  22.         private GPSInfoProvider()
  23.         {
  24.                 
  25.         }
  26.         
  27.         /**
  28.          * 为了让这个方法一定执行完,所以我们加入了synchronized来修饰
  29.          * @return
  30.          */
  31.         public static synchronized GPSInfoProvider getInstance(Context context)
  32.         {
  33.                 if(gpsInfoProvider == null)
  34.                 {
  35.                         gpsInfoProvider = new GPSInfoProvider();
  36.                         GPSInfoProvider.context = context;
  37.                 }
  38.                 return gpsInfoProvider;
  39.         }
  40.         
  41.         public String getLocation()
  42.         {
  43.                 locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
  44.                 
  45.                 String provider = getBestProvider();
  46.                 
  47.                 //这个方法是位置更新的的操作,有四个参数
  48.                 //第一个参数就是使用的定位设备啊,如gps,基站定位啊
  49.                 //第二个参数就是多长时间更新一次定位信息,太频繁了会很耗电,根据自己程序的实际需要来进行确定
  50.                 //第三个参数就是用户位移了多少米之后,就重新获取一次定位信息,太频繁了会很耗电,根据自己程序的实际需要来进行确定
  51.                 //最后一个参数就是在位置发生变化的回调方法
  52.                 locationManager.requestLocationUpdates(provider, 60000, 50, getListener());
  53.                 //locationManager.getAllProviders();//它会把所以支持的定位方式都打列出来,这样就可以知道手机所支持的定位啦
  54.                 
  55.                 SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
  56.                 String location = sp.getString("lostLocation", "");
  57.                 return location;
  58.         }
  59.         
  60.         //停止gps
  61.         public void stopGPSListener()
  62.         {
  63.                 if(locationManager != null)
  64.                 {
  65.                         locationManager.removeUpdates(getListener());
  66.                 }
  67.         }
  68.         
  69.         private String getBestProvider()
  70.         {
  71.                 Criteria criteria = new Criteria();
  72.                 //这个是定义它的定位精度的
  73.                 //Criteria.ACCURACY_COARSE  这个是一般的定位
  74.                 //Criteria.ACCURACY_FINE  这个是精准定位
  75.                 criteria.setAccuracy(Criteria.ACCURACY_FINE);
  76.                 
  77.                 //设置是不是对海拔敏感的
  78.                 criteria.setAltitudeRequired(false);
  79.                 
  80.                 //设置对手机的耗电量,定位要求越高,越耗电
  81.                 criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
  82.                 
  83.                 //设置对速度变化是不是敏感
  84.                 criteria.setSpeedRequired(true);
  85.                 
  86.                 //设置在定位时,是不是允许与运营商交换数据的开销
  87.                 criteria.setCostAllowed(true);
  88.                 
  89.                 //这个方法是用来得到最好的定位方式的,它有两个参数,一个是Criteria(类似于Map集合),就是一些条件,比如说对加速度敏感啊,什么海拔敏感这些的
  90.                 //第二个参数就是,如果我们置为false,那么我们得到的也有可能是已经关掉了的设备,如果是true那么,就只会得到已经打开了的设备
  91.                 return locationManager.getBestProvider(criteria, true);
  92.         }
  93.         
  94.         //做成单例模式
  95.         private synchronized MyLocationListener getListener()
  96.         {
  97.                 if(listener == null)
  98.                 {
  99.                         listener = new MyLocationListener();
  100.                 }
  101.                 return listener;
  102.         }
  103.         
  104.         //=========================================================================
  105.         
  106.         private class MyLocationListener implements LocationListener
  107.         {

  108.                 @Override
  109.                 public void onLocationChanged(Location location)
  110.                 {
  111.                         //手机位置发生改变时调用的方法
  112.                         String latitude = "纬度:" + location.getLatitude();//纬度
  113.                         String longitude = "经度:" + location.getLongitude();//经度
  114.                         SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
  115.                         Editor editor = sp.edit();
  116.                         editor.putString("lastLocation", latitude + " - " + longitude);
  117.                         editor.commit();
  118.                 }

  119.                 @Override
  120.                 public void onStatusChanged(String provider, int status, Bundle extras)
  121.                 {
  122.                         //定位设备的状态发生改变的时候调用的方法,比如说用户把设备打开,或关闭,第二个参数就是设备的状态啦
  123.                 }

  124.                 @Override
  125.                 public void onProviderEnabled(String provider)
  126.                 {
  127.                         //设备打开的时候调用的方法
  128.                 }

  129.                 @Override
  130.                 public void onProviderDisabled(String provider)
  131.                 {
  132.                         //设备关闭的时候调用的方法
  133.                 }
  134.                 
  135.         }

  136. }
复制代码
然后呢,我们就要开启一个广播接收者啦,一但拦截到我们发的短信,那么就进行指令的分析还有相应的处理
所以我们新建一个广播接收者com.xiaobin.security.receiver.SmsReceiver
  1. package com.xiaobin.security.receiver;

  2. import com.xiaobin.security.engine.GPSInfoProvider;

  3. import android.content.BroadcastReceiver;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.telephony.SmsManager;
  7. import android.telephony.SmsMessage;

  8. public class SmsReceiver extends BroadcastReceiver
  9. {

  10.         @Override
  11.         public void onReceive(Context context, Intent intent)
  12.         {
  13.                 Object[] pdus = (Object[]) intent.getExtras().get("pdus");
  14.                 for(Object pdu : pdus)
  15.                 {
  16.                         SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
  17.                         //拿到短信内容
  18.                         String content = smsMessage.getMessageBody();
  19.                         //拿到发送人的电话号码
  20.                         String sender = smsMessage.getOriginatingAddress();
  21.                         
  22.                         //这个是通过短信发送指令,然后进行一些操作的
  23.                         if(content.equals("#*location*#"))
  24.                         {
  25.                                 abortBroadcast();//终止广播,免得让小偷看到短信
  26.                                 GPSInfoProvider gpsInfoProvider = GPSInfoProvider.getInstance(context);
  27.                                 String location = gpsInfoProvider.getLocation();
  28.                                 System.out.println(location);
  29.                                 if(!location.equals(""))
  30.                                 {
  31.                                         //发送短信
  32.                                         SmsManager smsManager = SmsManager.getDefault();
  33.                                         smsManager.sendTextMessage(sender, null, location, null, null);
  34.                                 }
  35.                         }
  36.                 }
  37.         }

  38. }
复制代码
上面获取短信的代码可能大家有点疑问了,为什么会是pdus,这个的话,我们就可以下载一下Android自己写好了的短信管理器的代码啦,我们可以下载一下它的源码来看一下,Android源码下载的方法我们之前说过的啦!去看一下,就可以知道为什么的啦。大家可以搜一下sms就可以找到的啦,然后下来来看看吧。好啦,从上面的代码也可以看到,我们拿到了那条指令短信,然后,就获取位置,然后再发回给我们的手机,而且也把广播终止啦,这样,小偷就不会知道我们把短信发送到手机上啦,这样我们就可以瞒过小偷,进行一些操作啦,我们还可以定义多一些指令,比如说,删除东西的指令啦,格式化的指令啦,乱发东西的指令啦,都可以的,我们看一下有没有空,尽量写多一些功能!好啦,现在广播接收者就写好啦,我们也要在AndroidMainfest里面注册它啦
  1. <receiver 
  2.             android:name="com.xiaobin.security.receiver.SmsReceiver">
  3.             <intent-filter android:priority="1000">
  4.                 <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  5.             </intent-filter>
  6.         </receiver>
复制代码
还要加入相应的权限呢
  1.     <uses-permission android:name="android.permission.RECEIVE_SMS"/>
  2.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  3.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  4.     <!-- 这个是用模拟器进行测试才需要用到的权限,表示是这个模拟的位置 -->
  5.     <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
复制代码
注意,模拟器2.3的Android版本的gps是有问题的,所以如果用模拟器测试的话,那么你就不要用2.3的模拟器啦

好啦,再说一点,我们拿到的是手机的经度可纬度,只要我们在谷歌地图那里查一下,就可以得到在那里的啦,我们明天就会继续完善我们的指令的,加入锁屏还有恢复到出厂模式,和播放报警音乐!




好啦,今天就讲到这里,下一次,我们再继续

 Security_10GPS定位与发送短信指令 (1).rar (1.61 MB, 下载次数: 301) 

目录
相关文章
|
Android开发
《手机卫士性能优化方案-Android篇》电子版地址
手机卫士性能优化方案-Android篇
75 0
《手机卫士性能优化方案-Android篇》电子版地址
|
安全
金山手机卫士正式版发布 永久免费
近日,金山安全软件有限公司首次公开发布金山手机卫士正式版,并宣布下载,安装,升级金山手机卫士完全免费,手机卫士是金山安全软件公司今年成立后回馈用户的又一力作。目前支持主流的智能手机操作系统——塞班S60和Android。
988 0
|
XML API Android开发
Android--手机卫士涉及的知识点总结(一)
Splash界面 splash: 溅,洒 展现产品的logo提升产品的知名度 初始化操作(创建数据库,读取配置文件) 连接服务器检查软件授权 连接服务器检查软件的更新 自动更新的前提 包名...
1120 0
|
算法 数据库 Android开发
Android--手机卫士涉及的知识点总结(二)
短信拦截:开启服务并在里面注册一个广播接收者 ? 1 2 3 开启服务: Intent intent=new Intent(SettingActivity.
900 0
|
数据库 Android开发 数据安全/隐私保护
Android--手机卫士涉及的知识点总结(五)
主活动中点击切换 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
870 0
|
缓存 安全 数据库
Android--手机卫士涉及的知识点总结(六)
内容观察者 数据库中大声发个消息 ? 1 2 Uri uri=Uri.
1427 0
|
Android开发 安全 数据格式
手机卫士01-启动界面
首先,我也只是一个菜鸟来的,所以这个项目写得也很菜的,各个大神就不要喷得太厉害啦,有问题可以提出来,但因为是学习型的项目,所以不可能会像商业的项目那么的规范,和那么多的优化的。所以各位见谅啊。好了,废话不多说,直接上图 这个就是我们的程序启动时的界面,上面有个TextView显示你当前的版本,还有个ProgressBar显示正在检查更新        这两张就是我们这个项目的主
1067 0
|
XML 安全 应用服务中间件
手机卫士02-与服务器交互
好啦,我们继续我们昨天的那个项目,昨天我们只完成了一个程序启动时的欢迎界面,但是提到了,启动那个界面时会进行版本的检查,所以今天我们就做那个版本的检查那一块。 既然要做版本检查,那肯定要有服务器啦,所以我们就用到tomcat啦,因为这个项目是Android, 所以我就不写那个服务器端的程序啦,我只用tomcat来进行一个简单的从服务器读取数据,然后更新程序。不会专门写一个服务器端来进行业
1047 0
|
XML Android开发 数据格式
手机卫士04-自定义显示图片
首先,先和大家说个对不起先,昨天太赶啦,一时没说清楚昨天的内容,其实昨天还有一些UI的知识点还没讲的,而且那个代码也是有一点问题的,所以今天把它补回来 我们先讲一下,昨天忘记说了的内容 其实昨天忘记说了的就是那个自定义标题栏那里啦 自定义标题栏,其实就是把原来的标题栏隐藏掉,然后再自己写一个TextView这些的控件,把它放上去的而已,一说就很简单的啦 但我们这里有一个知识点的
1148 0

热门文章

最新文章