大家好,又見面了,我是你們的朋友全棧君。
微信模擬位置是通過位置欺騙,讓微信誤以為我們就在當前的位置進行周邊好友的搜索與添加。
這是一個很老的功能,為什么說很老呢?因為這是在.1的時候流行的一個功能微信位置模擬器哪個好,在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();
}
}
復制
一定要加權限
復制
好了這個時候模擬位置完成了,我模擬的位置是“上海”
我們來看看效果
這樣就完成了,
注意:不要打包安裝正式版的,這個權限是debug權限
好了如果需要關閉模擬位置:
public void stopMockLocation() {
if (isSimulateStart) {
try {
locationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
// 若未成功addTestProvider,或者系統模擬位置已關閉則必然會出錯
}
isSimulateStart = false;
}
}
復制
如果有什么好的方法,或者確定支持4.4以上,親們要給個鏈接啊!不要忽悠我呀…………..