前期有这需求,代码也敲了,但是后面功能被阉,现在项目要提交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;
}