Android的模拟位置不与谷歌地图合作 [英] Android Mock location don't work with google maps

查看:186
本文介绍了Android的模拟位置不与谷歌地图合作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个模拟GPS定位的Andr​​oid应用程序,它的伟大工程具有最喜欢IGO,Waze的,osmAnd,GPS状态多的节目,但不能与谷歌地图仍然显示实际位置我在。

我禁用了GPS和网络位置为好。

任何想法,为什么呢?如何解决呢?谢谢

在code我使用:

 公共无效的setLocation(双纬度,经度双,双海拔,浮动轴承,浮法速度){
    字符串PROVIDER_NAME = LocationManager.GPS_PROVIDER;
    locationManager.addTestProvider(PROVIDER_NAME,假的,假的,假的,假的,真实的,真实的,真实的,Crit​​eria.POWER_LOW,Crit​​eria.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆