如何正确和一致地模拟Android中的位置?

这是我试过的:

LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    String provider = locationManager.getBestProvider(criteria,true);
    locationManager.addTestProvider(provider,false,true,Criteria.ACCURACY_FINE);
    locationManager.setTestProviderEnabled(provider,true);

    Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            Location location = new Location(provider);
            location.setLatitude(...);
            location.setLongitude(...);
            location.setAccuracy(Criteria.ACCURACY_FINE);
            location.setTime(System.currentTimeMillis());
            location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
            locationManager.setTestProviderLocation(provider,location);

            handler.postDelayed(this,INTERVAL);
        }
    };

    handler.postDelayed(runnable,INTERVAL);

问题是,无论我设置INTERVAL多低,谷歌地图上的标记似乎都不能停留在模拟位置.它总是闪回原始位置,直到再次调用Runnable上的run().我相信有一种合法的方式来模拟位置而不是我的循环Handler.

解决方法

当你拨打这一行时

locationManager.setTestProviderLocation(provider,location);

它设置了此提供程序的当前位置,假设我的测试提供程序是AbcProvider

String provider = "AbcProvider";
location.setProvider(provider);
locationManager.setTestProviderLocation(provider,location);

> locationManager.getLastKNownLocation(“AbcProvider”);返回当前设置的位置
如果你调用requestLocationUpdates(“AbcProvider”,…),将会触发onLocationChanged();

你的代码没问题!但要明确你想看到嘲弄的结果.运行代码后,如果您自己查看Google地图应用,则模拟将无法正常工作,因为它无法通过LocationManager获取位置.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...