微信模拟位置是通过位置欺骗,让微信误以为我们就在当前的位置进行周边好友的搜索与添加。
这是一个很老的功能,为什么说很老呢?因为这是在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();
}
}
一定要加权限
好了这个时候模拟位置完成了,我模拟的位置是“上海”
我们来看看效果
这样就完成了,
注意:不要打包安装正式版的,这个权限是debug权限
好了如果需要关闭模拟位置:
public void stopMockLocation() {
if (isSimulateStart) {
try {
locationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
// 若未成功addTestProvider,或者系统模拟位置已关闭则必然会出错
}
isSimulateStart = false;
}
}
如果有什么好的方法,或者确定支持4.4以上,亲们要给个链接啊!不要忽悠我呀…………..