Android根据系统策略选择GPS定位

前期有这需求,代码也敲了,但是后面功能被阉,现在项目要提交svn,放在这里有需要直接搬过去

====================================================================================================================================

直接上代码:

LocationItem.java

import com.google.gson.Gson;

/**
 * 
 *
 */
public class LocationItem {

	private String lat;
	private String lon;
	private String timeStamp;
	public String getLat() {
		return lat;
	}
	public void setLat(String lat) {
		this.lat = lat;
	}
	public String getLon() {
		return lon;
	}
	public void setLon(String lon) {
		this.lon = lon;
	}
	public String getTimeStamp() {
		return timeStamp;
	}
	public void setTimeStamp(String timeStamp) {
		this.timeStamp = timeStamp;
	}
	public LocationItem(String lat, String lon, String timeStamp) {
		super();
		this.lat = lat;
		this.lon = lon;
		this.timeStamp = timeStamp;
	}
	public LocationItem() {
		super();
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return new Gson().toJson(this);
	}
	
}

LocationUploadService.java

import java.util.List;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;

import com.lidroid.xutils.util.LogUtils;
import *.client.core.service.IParamsService;
import *.client.core.service.impl.ParamsServiceImpl;

/**
 * 定位服务 
 */
public class LocationUploadService extends Service {

	private LocationManager locationManager;
	/** 过滤提供器 */
	private Criteria criteria = new Criteria();
	/** 多久检测位置变化 毫秒 */
	private static int minUpdateTime = 2 * 1000;//60 * 1000;
	/** 多远触发更新 米 */
	private static int minUpdateDistance = 1;//50;

	@Override
	public void onCreate() {
		super.onCreate();  
	}

	@Override
	public IBinder onBind(Intent intent) {
		
		return null;
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		if (null == criteria) {
			criteria = new Criteria();
		}

		criteria.setAccuracy(Criteria.ACCURACY_FINE);// 要求高精度
		criteria.setPowerRequirement(Criteria.POWER_LOW);// 低耗电

		criteria.setAltitudeRequired(false);// 不要求海拔信息
		criteria.setBearingRequired(false);// 不要求方位信息
		criteria.setSpeedRequired(false);// 不要求速度信息

		criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);// 水平精度要求高
		registerListener();
		return super.onStartCommand(intent, flags, startId);
	}

	/**
	 * 注册监听器
	 */
	private void registerListener() {
		removeAllUpdate();
		String bestProvider = locationManager.getBestProvider(criteria, false);// false:不排除未启动
		final String bestEnabledProvider = locationManager.getBestProvider(
				criteria, true);// true:排除未启动
		d("提供器筛选结果:(bestProvider=" + bestProvider + "  bestEnabledProvider:"
				+ bestEnabledProvider + ")");
		if (null == bestProvider) {
			d("设备无定位模块");
		} else if (bestProvider.equals(bestEnabledProvider)) {
			d("提供器一致,目前为最佳:" + bestEnabledProvider);// 一致,则最佳已开启
			locationManager.requestLocationUpdates(bestEnabledProvider,
					minUpdateTime, minUpdateDistance, bestEnabledlistener);
		} else {
			// 不一致,最佳未启动,注册最佳,当最佳开启时重新注册
			locationManager.requestLocationUpdates(bestProvider, minUpdateTime,
					minUpdateDistance, bestlistener);
			if (null != bestEnabledProvider) {
				d("暂时用已开启中的最佳:" + bestEnabledProvider);
				locationManager.requestLocationUpdates(bestEnabledProvider,
						minUpdateTime, minUpdateDistance, bestEnabledlistener);
			} else {
				d("当前没有一个定位提供器是开启的");
				List<String> allproviders = locationManager.getAllProviders();
				for (String provider : allproviders) {
					d("未开启的提供器:" + provider);
					locationManager.requestLocationUpdates(provider, 0, 0,
							bestEnabledlistener);// 没有一个可以用的时候随便开启一个都是最佳的
				}
			}
		}
	}

	/** 最佳策略提供器的监听 */
	private LocationListener bestlistener = new LocationListener() {
		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			d("gps--bestlistener-onStatusChanged" + provider + " " + status);
		}

		@Override
		public void onProviderEnabled(String provider) {
			d("gps--bestlistener-onProviderEnabled" + provider);
			registerListener();// 最好的可以用时,重新选择
		}

		@Override
		public void onProviderDisabled(String provider) {
			d("gps--bestlistener-onProviderDisabled" + provider);
		}

		@Override
		public void onLocationChanged(Location location) {
			localtionChange(location);
		}

		
	};

	/** 最佳策略提供器的监听 限制在已开启的提供器 */
	private LocationListener bestEnabledlistener = new LocationListener() {
		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			d("gps--bestEnabledlistener-onStatusChanged" + provider + " "
					+ status);
		}

		@Override
		public void onProviderEnabled(String provider) {
			d("gps--bestEnabledlistener-onProviderEnabled" + provider);
		}

		@Override
		public void onProviderDisabled(String provider) {
			d("gps--bestEnabledlistener-onProviderDisabled" + provider);
			registerListener();// 可用中最好的关闭时,重新选择
		}

		@Override
		public void onLocationChanged(Location location) {
			localtionChange(location);
		}
	};

	private void removeAllUpdate() {
		d("清除监听");
		if (null != locationManager) {
			if (null != bestlistener) {
				locationManager.removeUpdates(bestlistener);
			}
			if (null != bestEnabledlistener) {
				locationManager.removeUpdates(bestEnabledlistener);

			}
		}
	}

	@Override
	public void onDestroy() {
		removeAllUpdate();
		super.onDestroy();
	}

	private void d(String msg) {
		LogUtils.d(Thread.currentThread().getName() + ":" + msg);
	}
	
	private void localtionChange(Location location) {
		d("定位:"+"( "+location.getLatitude()+" , "+location.getLongitude()+" )    "+location.toString());
		
		IParamsService paramsService = ParamsServiceImpl.getInstance();
		paramsService.setLocaltion(location);
		
	}
}

权限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
剩下就是启动这个服务



将定位数据写入参数文件提供读取

	@SuppressLint("SimpleDateFormat")
	@Override
	public void setLocaltion(Location location) {
		if (null != location) {
			setParams(ParamsConst.LOCATION_LAT, location.getLatitude() + "");
			setParams(ParamsConst.LOCATION_LON, location.getLongitude() + "");
			setParams(ParamsConst.LOCATION_IS_UPDATE, "1");
			setParams(ParamsConst.LOCATION_TIME_STAMP, new SimpleDateFormat(
					"yyyyMMddHHmmss").format(new Date()));
		}
	}

	@Override
	public LocationItem getLocation() {
		LocationItem location = new LocationItem();
		String isUpdate = getParams(ParamsConst.LOCATION_IS_UPDATE);
		setParams(ParamsConst.LOCATION_IS_UPDATE, "0");
		if (null != isUpdate && "1".equals(isUpdate)) {
			location.setLat(getParams(ParamsConst.LOCATION_LAT));
			location.setLon(getParams(ParamsConst.LOCATION_LAT));
			location.setTimeStamp(getParams(ParamsConst.LOCATION_TIME_STAMP));
			return location;
		}
		return null;
	}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mars_zhanglin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值