Android中常用的定位方式
一,GPS定位
定义:全球卫星定位系统,直接和卫星交互,获取设备经纬度
优点:
-
走卫星通信通道,无需打开Wifi或流量就能获得位置信息
-
精确度最高,几米到几十米
缺点:
-
需要手机支持GPS模块(大部分智能机基本都有)
-
耗电量大
-
大部分用户可能关闭GPS
-
定位慢,特别是从GPS模块启动到获取到第一次定位数据,需要的时间较长
-
室内、地下室基本无法使用
二,Network定位
三角定位:由于每个基站的位置是固定的,手机通过扫描到附近的三个基站的信号,因其必然在这三个基站的共同覆盖范围内,从而利用电磁波在这三个基站间中转所需要时间,来算出手机所在的准确坐标。但因大部分手机都只能获取到单个基站的ID,所以此方法基本无法实行
单基站定位:利用获取最近的基站的信息,其中包括基站ID,lac、mcc、mnc和信号强度,将这些数据发送到Google的定位Web服务里,就能拿到当前所在的位置信息,误差一般在几十米到几百米之内。其中信号强度这个数据很重要
优点:
-
只要网络通畅即可定位
-
可以在室内使用
缺点:
-
精确度很差,一般有几百米,甚至上千米的误差。误差和基站的信号覆盖半径有关,Wifi覆盖半径大概100米左右,而基站则到千米级别
三,WIFI定位
根据一个固定的WifiMAC地址,通过收集到的该Wifi热点的位置,然后访问网络上的定位服务以获得经纬度坐标。因为它和基站定位其实都需要使用网络,所以在Android也统称为Network方式。
优点:
-
精度相对GPS差一点,但也能到十几米、几十米的误差
-
低耗电
四,IP定位
根据设备上获得的IP地址,访问网络上的定位服务以获得经纬度坐标
五,AGPS定位
辅助全球卫星定位系统,结合GSM或GPRS与传统卫星定位,利用基站代送辅助卫星信息,缩减GPS芯片获取卫星信号的延迟时间,受遮盖的室内也能借基站讯号弥补,减轻GPS芯片对卫星的依赖度
优点:
-
在室外等空旷地区,其精度在正常的GPS工作环境下,可达10米左右,堪称目前定位精度最高的一种定位技术
-
首次捕获GPS信号的时间一般仅需几秒,不像GPS的首次捕获时间可能要2~3分钟
缺点:
-
需要在手机内增加GPS接收机模块,并改造手机天线,同时要在移动网络上加建位置服务器、差分GPS基准站等设备。如果要提高该方案在室内等GPS信号屏蔽地区的定位有效性,该方案还提出需要增添类似于EOTD方案中的位测量单元(LMU)。
虚拟定位与检测防护
一,开发者模式下,打开设置里面的模块位置开关,进行虚拟定位。
防护措施:
1,通过系统Api可检测到是否打开了模拟定位开关
Settings.Secure.getInt(context.getContentResolver(),Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0;
2,在定位前先调用removeTestProvider方法,移除虚拟定位。
二,使用模拟器进行虚假定位
在PC上安装模拟器,使用一些特定软件模拟虚假IP,达到虚拟定位的效果
防护措施:
在Android中通过系统Api检测当前设备是否是模拟器,进行相关的提醒与限制。
boolean isEmulator = Build.FINGERPRINT.contains("generic")|| Build.FINGERPRINT.contains("vbox")|| Build.FINGERPRINT.contains("generic_x86")|| Build.FINGERPRINT.contains("emulator")|| Build.FINGERPRINT.contains("simulator");
三,使用xposed对获取定位的软件进行Hook修改获取的经纬度
xposed使用的前提是需要当前设备拥有root权限,针对root过的设备进行hook修改系统的api,致使获取经纬度的应用获取到虚假的经纬度
防护措施:
针对此种方案,目前只能检测当前设备是否root,做相应的提醒或限制处理,无法做到实质的防护处理。
检测当前设备是否Root
public boolean isRooted() {Process process = null;try {process = Runtime.getRuntime().exec(new String[]{"su", "-c", "whoami"});BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {if (line.trim().equals("root")) {return true;}}return false;} catch (IOException e) {return false;} finally {if (process != null) {process.destroy();}}
}
四,反编译App,修改源码,植入虚拟定位相关逻辑
防护措施:
1,针对定位核心代码进行混淆处理,对apk进行加固,增加破解难度。
2,检测当前设备是否安装了模拟定位的软件。
fun areThereMockPermissionApps(context: Context): Boolean {var count = 0val pm = context.packageManagerval packages = pm.getInstalledApplications(PackageManager.GET_META_DATA)for (applicationInfo in packages) {try {val packageInfo = pm.getPackageInfo(applicationInfo.packageName,PackageManager.GET_PERMISSIONS) // Get Permissions val requestedPermissions = packageInfo.requestedPermissionsif (requestedPermissions != null) {for (i in requestedPermissions.indices) {if (requestedPermissions[i] == "android.permission.ACCESS_MOCK_LOCATION" && applicationInfo.packageName != context.packageName) {count++}}}} catch (e: NameNotFoundException) {Log.e("Got exception " + e.getMessage())}}return count > 0
}
五,重新编译修改Android系统,然后烧录相关设备
防护措施:
暂无解