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

来源:互联网 发布:iphone刷机后数据恢复 编辑:程序博客网 时间:2024/05/29 12:31

前期有这需求,代码也敲了,但是后面功能被阉,现在项目要提交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();}@Overridepublic String toString() {// TODO Auto-generated method stubreturn 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;@Overridepublic void onCreate() {super.onCreate();  }@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic 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() {@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {d("gps--bestlistener-onStatusChanged" + provider + " " + status);}@Overridepublic void onProviderEnabled(String provider) {d("gps--bestlistener-onProviderEnabled" + provider);registerListener();// 最好的可以用时,重新选择}@Overridepublic void onProviderDisabled(String provider) {d("gps--bestlistener-onProviderDisabled" + provider);}@Overridepublic void onLocationChanged(Location location) {localtionChange(location);}};/** 最佳策略提供器的监听 限制在已开启的提供器 */private LocationListener bestEnabledlistener = new LocationListener() {@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {d("gps--bestEnabledlistener-onStatusChanged" + provider + " "+ status);}@Overridepublic void onProviderEnabled(String provider) {d("gps--bestEnabledlistener-onProviderEnabled" + provider);}@Overridepublic void onProviderDisabled(String provider) {d("gps--bestEnabledlistener-onProviderDisabled" + provider);registerListener();// 可用中最好的关闭时,重新选择}@Overridepublic 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);}}}@Overridepublic 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")@Overridepublic 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()));}}@Overridepublic 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;}




0 0
原创粉丝点击