Android 模拟位置不适用于谷歌地图

标签 android mocking maps location

我创建了一个模拟 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());
}

最佳答案

您应该使用 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);
    }

}

关于Android 模拟位置不适用于谷歌地图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15071199/

相关文章:

android - 代码覆盖内联函数

java - 如何从 MockMultipartFile 在 Spring MVC 测试中生成异常?

c# - 在 Windows 窗体应用程序中显示 map

javascript - 使用 HTML5、CSS3、Javascript 创建交互式 map

android - 切换按钮安卓

android - Listview OnItemClickListener 在 MainActivity 上工作但不在类似的 TaskActivity 上工作

java - 如何在 Java 中模拟 System.in(除了在 Junit 测试用例中使用)?

android - 在 list 和源代码 android 中隐藏 API key

java - Retrofit 和 Jackson 以及解析 JSON

unit-testing - 在grails中模拟外部http请求