微信模拟位置想在哪就在哪(GPS欺骗)

微信模拟位置是通过位置欺骗,让微信误以为我们就在当前的位置进行周边好友的搜索与添加。

这是一个很老的功能,为什么说很老呢?因为这是在android4.1的时候流行的一个功能,android在4.4推出后这个功能基本不能使用了!即使很老但是最近也碰到了这样的需求,不过针对特殊的群体,手机定制而来,就没有限制了!

首先我们要知道怎么用:

首先:我们从设置里找到开发者选项(开发者都知道):
在这里就是,开发人员工具

微信模拟位置想在哪就在哪(GPS欺骗)_第1张图片

然后:打开允许模拟位置:

微信模拟位置想在哪就在哪(GPS欺骗)_第2张图片

进入代码阶段:

一、判断是否开启了地理位置模拟

 if (Settings.Secure.getInt(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0) {
                        // 开启了地理位置模拟
                        LocProvider();
                    } else {
                        UIUtils.showToast(getString(R.string.open_mock_location));
                    }

  private String mMockProviderName = LocationManager.GPS_PROVIDER;


 private void LocProvider() {
        formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        time = new Date().getTime();
        formatTime = formatter.format(time);
        initLocation();
        runFacke();
    }

二、然后就需要进行初始化,位置模拟了

/**
     * 初始化 位置模拟
     */
    public void initLocation() {
        //开启服务
        locationManager = (LocationManager) this
                .getSystemService(Context.LOCATION_SERVICE);

        LocationProvider provider = locationManager.getProvider(mMockProviderName);
        if (provider != null) {
            locationManager.addTestProvider(
                    provider.getName()
                    , provider.requiresNetwork()
                    , provider.requiresSatellite()
                    , provider.requiresCell()
                    , provider.hasMonetaryCost()
                    , provider.supportsAltitude()
                    , provider.supportsSpeed()
                    , provider.supportsBearing()
                    , provider.getPowerRequirement()
                    , provider.getAccuracy());
        } else {
            locationManager.addTestProvider(mMockProviderName, false, true, false,
                    false, true, true, true, 0, 5);
        }

        locationManager.setTestProviderEnabled(mMockProviderName, true);
        //新
        locationManager.setTestProviderStatus(mMockProviderName, LocationProvider.AVAILABLE, null,
                System.currentTimeMillis());

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED &&
                ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
                        != PackageManager.PERMISSION_GRANTED) {

            return;
        }
        locationManager.requestLocationUpdates(mMockProviderName, 0, 0,
                new LocationListener() {
                    @Override
                    public void onLocationChanged(Location location) {
                        double latitude = location.getLatitude();
                        double longitude = location.getLongitude();
                        LogUtils.e("latitude==>" + latitude + "------longitude===>" + longitude);
                    }

                    @Override
                    public void onStatusChanged(String s, int i, Bundle bundle) {

                    }

                    @Override
                    public void onProviderEnabled(String s) {

                    }

                    @Override
                    public void onProviderDisabled(String s) {

                    }
                });
    }

三、这儿需要开启一个线程机制来实现我自己设置的GPS位置,一直改变你手机的物理位置。

public void runFacke() {
        isSimulateStart = true;
        // 开启线程,一直修改GPS坐标
        thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (isSimulateStart) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    setLocation(Double.valueOf(latitude),
                            Double.valueOf(longitude));
                }
            }
        });
        thread.start();
    }

四、设置GPS的位置

/**
     * setLocation 设置GPS的位置
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    private void setLocation(double latitude, double longitude) {
        try {
            Location location = new Location(mMockProviderName);
            location.setLatitude(latitude);
            location.setLongitude(longitude);
            location.setAltitude(2.0f);  // 高程(米)
            location.setBearing(180);  // 方向(度)
            location.setSpeed(10);  //速度(米/秒)
            location.setAccuracy(0.1f);  // 精度(米)
            location.setTime(System.currentTimeMillis());
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
            }
            locationManager.setTestProviderLocation(mMockProviderName, location);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

一定要加权限

 

好了这个时候模拟位置完成了,我模拟的位置是“上海”

我们来看看效果

微信模拟位置想在哪就在哪(GPS欺骗)_第3张图片

这样就完成了,

注意:不要打包安装正式版的,这个权限是debug权限

好了如果需要关闭模拟位置:

  public void stopMockLocation() {
        if (isSimulateStart) {
            try {
                locationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
            } catch (Exception ex) {
                // 若未成功addTestProvider,或者系统模拟位置已关闭则必然会出错
            }
            isSimulateStart = false;
        }
    }

如果有什么好的方法,或者确定支持4.4以上,亲们要给个链接啊!不要忽悠我呀…………..

你可能感兴趣的:(android手机系统分析,和基站定位实现,基站开发,android,微信,位置欺骗,模拟位置)