微信模擬位置想在哪就在哪(GPS欺騙)
阿新 • • 發佈:2019-02-14
微信模擬位置是通過位置欺騙,讓微信誤以為我們就在當前的位置進行周邊好友的搜尋與新增。
這是一個很老的功能,為什麼說很老呢?因為這是在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以上,親們要給個連結啊!不要忽悠我呀…………..