Android的模拟位置不与谷歌地图合作 [英] Android Mock location don't work with google maps
问题描述
我创建了一个模拟GPS定位的Android应用程序,它的伟大工程具有最喜欢IGO,Waze的,osmAnd,GPS状态多的节目,但不能与谷歌地图仍然显示实际位置我在。
我禁用了GPS和网络位置为好。
任何想法,为什么呢?如何解决呢?谢谢
在code我使用:
公共无效的setLocation(双纬度,经度双,双海拔,浮动轴承,浮法速度){
字符串PROVIDER_NAME = LocationManager.GPS_PROVIDER;
locationManager.addTestProvider(PROVIDER_NAME,假的,假的,假的,假的,真实的,真实的,真实的,Criteria.POWER_LOW,Criteria.ACCURACY_FINE); locationManager.setTestProviderEnabled(PROVIDER_NAME,真);
locationManager.setTestProviderStatus(PROVIDER_NAME,LocationProvider.AVAILABLE,空,System.currentTimeMillis的()); 位置位置=新的位置(PROVIDER_NAME);
location.setLatitude(纬度);
location.setLongitude(经度);
location.setAltitude(高度);
location.setBearing(轴承);
location.setSpeed(速度);
location.setTime(System.currentTimeMillis的());
locationManager.setTestProviderLocation(PROVIDER_NAME,location.getLocation());
}
您应该只是使用 GoogleMap.setLocationSource(LocationSource源)
提供最新的谷歌地图随机位置SDK在Android上。使用随机位置来源是这样的:
//在你MapFragment实现或类似
如果(BuildConfig.DEBUG)
map.setLocationSource(新MockLocationSource());MockLocationSource.java:
公共类MockLocationSource实现LocationSource { 私有静态最终浮动精度= 1; //米
私有静态最终诠释MAX_SPEED = 10; // 女士
私有静态最后的经纬度CENTER =新的经纬度(59.91127,10.70834);
私有静态最后双DELTA_LAT = 0.0005;
私有静态最后双DELTA_LON = 0.0005; 私有静态最后长UPDATE_PERIOD = TimeUnit.SECONDS.toMillis(2); 私人最终处理程序处理程序=新的处理程序();
私人经纬度lastCoordinate = CENTER;
私人OnLocationChangedListener侦听器; 私人无效scheduleNewFix(){
handler.postDelayed(updateLocationRunnable,UPDATE_PERIOD);
} 私人最终可运行updateLocationRunnable =新的Runnable(){ @覆盖
公共无效的run(){
位置randomLocation = generateRandomLocation();
listener.onLocationChanged(randomLocation);
scheduleNewFix();
}
}; 公共场所generateRandomLocation(){ 位置位置=新的位置(的getClass()getSimpleName());
location.setTime(System.currentTimeMillis的());
location.setAccuracy(精度);
location.setBearing(randomizer.nextInt(360));
location.setSpeed(randomizer.nextInt(MAX_SPEED));
location.setLatitude(lastCoordinate.latitude + scaleOffset(DELTA_LAT));
location.setLongitude(lastCoordinate.longitude + scaleOffset(DELTA_LON)); lastCoordinate =新经纬度(location.getLatitude(),location.getLongitude()); 返回的位置;
} 私人最终静态随机随机函数发生器=新的随机(); 私人双scaleOffset(double值){
回报(randomizer.nextDouble() - 0.5)*值;
} @覆盖
公共无效激活(OnLocationChangedListener locationChangedListener){
听众= locationChangedListener;
scheduleNewFix();
} @覆盖
公共无效停用(){
handler.removeCallbacks(updateLocationRunnable);
}}
I created an Android application that mock the gps location, its works great with most of the programs like igo, waze, osmAnd, GPS status and more, but not with google maps that still show the actual position I'm on.
I disabled the gps and network location as well.
Any ideas why is it? how to solve it? Thanks
The code I use:
public void setLocation(double latitude, double longitude, double altitude, float bearing, float speed){
String PROVIDER_NAME = LocationManager.GPS_PROVIDER;
locationManager.addTestProvider(PROVIDER_NAME, false, false, false, false, true, true, true, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);
locationManager.setTestProviderEnabled(PROVIDER_NAME, true);
locationManager.setTestProviderStatus(PROVIDER_NAME, LocationProvider.AVAILABLE, null, System.currentTimeMillis());
Location location = new Location(PROVIDER_NAME);
location.setLatitude(latitude);
location.setLongitude(longitude);
location.setAltitude(altitude);
location.setBearing(bearing);
location.setSpeed(speed);
location.setTime(System.currentTimeMillis());
locationManager.setTestProviderLocation(PROVIDER_NAME, location.getLocation());
}
You should rather use GoogleMap.setLocationSource(LocationSource source)
for providing random locations to the latest Google Maps SDK on Android. Use a random location source like this:
// In your MapFragment implementation or similar
if (BuildConfig.DEBUG)
map.setLocationSource(new MockLocationSource());
MockLocationSource.java:
public class MockLocationSource implements LocationSource {
private static final float ACCURACY = 1; // Meters
private static final int MAX_SPEED = 10; // m/s
private static final LatLng CENTER = new LatLng(59.91127, 10.70834);
private static final double DELTA_LAT = 0.0005;
private static final double DELTA_LON = 0.0005;
private static final long UPDATE_PERIOD = TimeUnit.SECONDS.toMillis(2);
private final Handler handler = new Handler();
private LatLng lastCoordinate = CENTER;
private OnLocationChangedListener listener;
private void scheduleNewFix() {
handler.postDelayed(updateLocationRunnable, UPDATE_PERIOD);
}
private final Runnable updateLocationRunnable = new Runnable() {
@Override
public void run() {
Location randomLocation = generateRandomLocation();
listener.onLocationChanged(randomLocation);
scheduleNewFix();
}
};
public Location generateRandomLocation() {
Location location = new Location(getClass().getSimpleName());
location.setTime(System.currentTimeMillis());
location.setAccuracy(ACCURACY);
location.setBearing(randomizer.nextInt(360));
location.setSpeed(randomizer.nextInt(MAX_SPEED));
location.setLatitude(lastCoordinate.latitude + scaleOffset(DELTA_LAT));
location.setLongitude(lastCoordinate.longitude + scaleOffset(DELTA_LON));
lastCoordinate = new LatLng(location.getLatitude(), location.getLongitude());
return location;
}
private final static Random randomizer = new Random();
private double scaleOffset(double value) {
return (randomizer.nextDouble() - 0.5) * value;
}
@Override
public void activate(OnLocationChangedListener locationChangedListener) {
listener = locationChangedListener;
scheduleNewFix();
}
@Override
public void deactivate() {
handler.removeCallbacks(updateLocationRunnable);
}
}
这篇关于Android的模拟位置不与谷歌地图合作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!