高频率百度定位与高德定位

百度定位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();
			}
		}
	}
}

勘误

以上方法由于错误的验证方式,现在发现是无效的,若对您造成困扰,十分抱歉。

发表评论