Android模拟位置信息


Android模拟位置程序,俗称GPS欺骗,只能修改采用GPS定位的软件。 手机定位方式目前有4种:基站定位,WIFI定位,GPS定位,AGPS定位

常见的修改手法:
1. 抓包欺骗法,抓包改包欺骗服务器端, 但是得专门去针对某款app,而且现在很多app数据包都加密了
2. hook java层经纬度获取函数, 这个方法以前可以用,现在不行了
3. hook native层经纬度获取函数 
4. 使用允许模拟地址位置信息(不是很通用有版本限制)

为了修改微信朋友圈地理位置信息,为了好玩
试过了上面的一些方法
1. xpose hook java层gps函数试过了没有用
2. 抓包发现全部加密了(去年经纬度信息都还没有加密的)
3. hook native没有去研究
4. 允许地址位置信息模拟(实测可以用)  无需root
       但是有版本限制, 5.0以后这个功能有限制
       4.4.2版本的Nexus失效
       红米4.1.2成功了

下文主要讲解方法4, 允许模拟地理位置信息法

一.开启允许位置信息模拟
该功能在开发者选项里面,勾选允许地理位置信息即可
Android模拟位置信息

二. 开始编码
1. 成员定义
private String mMockProviderName = LocationManager.GPS_PROVIDER;
private Thread thread;
private LocationManager locationManager;

private Boolean is_run = true;  


2. 初始化
/**
 * inilocation 初始化 位置模拟
 * 
 */
private void init_location() {
    locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    locationManager.addTestProvider(mMockProviderName, false, true, false, false, true, true, true, 0, 5);
    locationManager.setTestProviderEnabled(mMockProviderName, true);
    locationManager.requestLocationUpdates(mMockProviderName, 0, 0, this);

}  


3. 设置地理位置模拟
@SuppressLint("NewApi")
private void setLocation(double longitude, double latitude) {
    Location location = new Location(mMockProviderName);
    location.setTime(System.currentTimeMillis());
    location.setLatitude(latitude);
    location.setLongitude(longitude);
    location.setAltitude(2.0f);
    location.setAccuracy(3.0f);
    location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
    locationManager.setTestProviderLocation(mMockProviderName, location);

}  


4. 开启线程一直修改
// 开启线程,一直修改GPS坐标
thread = new Thread(new Runnable() {
    @Override
    public void run() {
        while (is_run) {
            try {
                Thread.sleep(500);
                setLocation(longitude, latitude);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
});

thread.start();  


5.检测是否开启了允许地址位置模拟
import android.provider.Settings;
if (Settings.Secure.getInt(getContentResolver(),Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0){
    // 开启了地理位置模拟

}  



最后在加上百度地图SDK就可以随意的获取经纬度坐标了并修改地理位置坐标了
百度地图SDK用法:

代码上传github:

最后的效果:
Android模拟位置信息

上一篇:《python3网络爬虫开发实战》第一章、开发环境配置-问题汇总


下一篇:使用Docker link搭建PHP开发环境