GPS定位
www.eefocus.com/baike/49719… 权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
var locManager = getSystemService(Context.LOCATION_SERVICE)
var loc = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0F, object : LocationListener{
...
override fun onLocationChanged(location: Location?) {
Log.e("gpslocation", location.toString())
toast(location.toString())
}
})
主要通过一下几个方法监听或者获取Location数据
getLastKnownLocation
getLastLocation
onLocationChanged
拦截和替换策略: 在LMS服务中,在对应接口替换Location对象,主要是替换经纬度信息
public void set(Location l) {
...
mLatitude = l.mLatitude; //维度
mLongitude = l.mLongitude; //经度
mAltitude = l.mAltitude; //高度
...
}
指定位置的经度的经纬度信息主要从网上获取
NETWORK定位
与gps定位代码基本一致,只不过将provider改成LocationManager.NETWORK_PROVIDER
基站定位
frameworks\opt\telephony\src\java\com\android\internal\telephony\gsm\GSMPhone.java
frameworks\opt\telephony\src\java\com\android\internal\telephony\gsm\ GsmServiceStateTracker.java
frameworks\opt\telephony\src\java\com\android\internal\telephony\cdma\CDMAPhone.java
getCellLocation
GSM基站信息:
GSM网是Global System for Mobile Communications的简称,中文为全球移动通讯系统,俗称"全球通",是一种起源于欧洲的移动通信技术标准,是第二代移动通信技术,其开发目的是让全球各地可以共同使用一个移动电话网络标准,是世界上第一个对数字调制、网络层结构和业务作了规定的蜂窝系统的网络。
基站信息包含如下:
MCC,Mobile Country Code,移动国家代码(中国的为460);
MNC,Mobile Network Code,移动网络号码(中国移动为00,中国联通为01);
LAC,Location Area Code,位置区域码;
CID,Cell Identity,基站编号,是个16位的数据(范围是0到65535)。
CDMA基站信息:
BID, SID, NID, LAT LONG
| 名称 | 类型 | 必填 | 说明 | |
|---|---|---|---|---|
| sid | int | 是 | SID系统识别码(各地区一个) | |
| nid | int | 是 | NID网络识别码(各地区1-3个) | |
| cellid | int | 是 | 基站号(bid) | |
| hex | int | 否 | 进制类型,16或10,默认:10 | |
| dtype | string | 否 | 返回的数据格式:json/xml/jsonp | |
| callback | string | 否 | 当选择jsonp格式时必须传递 | |
| key | string | 是 | APP KEY |
WIFI定位
wifi定位是通过WifiManager拿到wifi的信息,主要是wifi的BSSID(即mac地址)。然后通过一些api查询经纬度
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
android.net.wifi.WifiManager
wifiManager.getScanResults()
ScanReuslt有三个字段比较重要: SSID是wifi名称, BSSID是wifi的mac, level则是信号强度(负数) * 注意结果中同一个SSID可能会有多个,如果需要链接wifi可以通过信号强度过滤出最好的来链接
获取到上述信息后,然后通过一些api查询经纬度。这些wifi和经纬度的对应信息,一般需要特殊渠道获取
很多厂商的做的位置伪装功能,差不多都是基于上方的机制做的,在信息返回的地方进行拦截,用假的或者内置的特定地方的位置数据替换用户实际位置的数据