Android 模拟位置不适用于谷歌地图
Posted
技术标签:
【中文标题】Android 模拟位置不适用于谷歌地图【英文标题】:Android Mock location don't work with google maps 【发布时间】:2013-02-10 20:18:43 【问题描述】:我创建了一个模拟 gps 位置的 android 应用程序,它适用于大多数程序,如 igo、waze、osmAnd、GPS 状态等,但不适用于仍显示我所在实际位置的谷歌地图。
我也禁用了 gps 和网络位置。
任何想法为什么会这样?如何解决?谢谢
我使用的代码:
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());
【问题讨论】:
要使用模拟位置,您必须在清单中放入要使用模拟位置的清单 - 这是一个单独的权限。你确定谷歌地图有这个权限吗?它可能已决定不故意使用模拟。 感谢您的帮助。我猜他们有它,因为在其他模拟程序中,比如“伪造我的位置”它的作品。 我的猜测是谷歌地图的活动/片段在被带到前台时会采取行动,以避免成为位置欺骗的受害者。模拟 LocationProviders 在系统范围内生效,这也意味着另一个应用程序可以删除您的应用程序添加的模拟提供程序。如果您在查看 Google 地图后返回 Waze,Waze 是否仍会收到您的模拟 GPS 位置更新? 【参考方案1】:您应该使用GoogleMap.setLocationSource(LocationSource source)
为Android 上最新的Google Maps SDK 提供随机位置。使用这样的随机位置源:
// 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);
【讨论】:
部分设备没有谷歌地图SDK。【参考方案2】:感谢您的帮助。
我发现了问题,似乎当其他应用程序不需要时,护目镜需要设置准确性
所以添加行location.setAccuracy(1);
它解决了这个问题。
【讨论】:
谢谢,我也这样做了! 标记为答案?以上是关于Android 模拟位置不适用于谷歌地图的主要内容,如果未能解决你的问题,请参考以下文章