1. 程式人生 > >微信模擬位置想在哪就在哪(GPS欺騙)

微信模擬位置想在哪就在哪(GPS欺騙)

微信模擬位置是通過位置欺騙,讓微信誤以為我們就在當前的位置進行周邊好友的搜尋與新增。

這是一個很老的功能,為什麼說很老呢?因為這是在android4.1的時候流行的一個功能,android在4.4推出後這個功能基本不能使用了!即使很老但是最近也碰到了這樣的需求,不過針對特殊的群體,手機定製而來,就沒有限制了!

首先我們要知道怎麼用:

首先:我們從設定裡找到開發者選項(開發者都知道):
在這裡就是,開發人員工具

這裡寫圖片描述

然後:開啟允許模擬位置:

這裡寫圖片描述

進入程式碼階段:

一、判斷是否開啟了地理位置模擬

 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();
        }

    }

一定要加許可權

 <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />

好了這個時候模擬位置完成了,我模擬的位置是“上海”

我們來看看效果

這裡寫圖片描述

這樣就完成了,

注意:不要打包安裝正式版的,這個許可權是debug許可權

好了如果需要關閉模擬位置:

  public void stopMockLocation() {
        if (isSimulateStart) {
            try {
                locationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
            } catch (Exception ex) {
                // 若未成功addTestProvider,或者系統模擬位置已關閉則必然會出錯
            }
            isSimulateStart = false;
        }
    }

如果有什麼好的方法,或者確定支援4.4以上,親們要給個連結啊!不要忽悠我呀…………..