百度定位API提供的自动定位方法频率最高是 1 Hz。 可能对于大部分调用定位接口的APP是没有影响的,但是对于需要定位频率更高些的APP可能无法通过这种方式来实现。
mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类 mLocationClient.registerLocationListener(myListener); //注册监听函数 LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //可选,设置定位模式,默认高精度 //LocationMode.Hight_Accuracy:高精度; //LocationMode. Battery_Saving:低功耗; //LocationMode. Device_Sensors:仅使用设备; option.setCoorType("bd09ll"); //可选,设置返回经纬度坐标类型,默认gcj02 //gcj02:国测局坐标; //bd09ll:百度经纬度坐标; //bd09:百度墨卡托坐标; //海外地区定位,无需设置坐标类型,统一返回wgs84类型坐标 option.setScanSpan(0); //可选,设置发起定位请求的间隔,int类型,单位ms //如果设置为0,则代表单次定位,即仅定位一次,默认为0 //如果设置非0,需设置1000ms以上才有效 option.setOpenGps(true); //可选,设置是否使用gps,默认false //使用高精度和仅用设备两种定位模式的,参数必须设置为true option.setLocationNotify(true); //可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false option.setIgnoreKillProcess(false); //可选,定位SDK内部是一个service,并放到了独立进程。 //设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true) option.SetIgnoreCacheException(true); //可选,设置是否收集Crash信息,默认收集,即参数为false option.setWifiCacheTimeOut(5*60*1000); //可选,7.2版本新增能力 //如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位 option.setEnableSimulateGps(false); //可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false mLocationClient.setLocOption(option); //mLocationClient为第二步初始化过的LocationClient对象 //需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用 //更多LocationClientOption的配置,请参照类参考中LocationClientOption类的详细说明
所以考虑使用线程, 通过线程以较高频率(10Hz)来请求百度定位信息,实际上是可行的。
private class GpsThread extends Thread { private final static int FREQUENCY = 100; private boolean stop; public void stopMe(){ this.stop = true; } @Override public void run() { super.run(); stop = false; while (!stop){ try { mLocationClient.requestLocation(); sleep(FREQUENCY); } catch (InterruptedException e) { e.printStackTrace(); } } } }
之前的代码是使用百度定位Api进行的,现在迁移到高德定位,发现网上也没有相关的文章,现在把高德定位的解决方案也记录如下。
mLocationClient = new AMapLocationClient(getApplicationContext()); //设置定位回调监听 mLocationClient.setLocationListener(mLocationListener); //初始化AMapLocationClientOption对象 mLocationOption = new AMapLocationClientOption(); mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); //给定位客户端对象设置定位参数 mLocationClient.setLocationOption(mLocationOption); public class GaodeThread extends Thread{ @Override public void run() { super.run(); //现在是高德的100ms刷新一次 while (true){ try { mLocationClient.startLocation(); sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }
勘误
以上方法由于错误的验证方式,现在发现是无效的,若对您造成困扰,十分抱歉。