先写一个Util类import java.util.Map;import android.app.Activity;
import android.app.PendingIntent;
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.net.Uri;
import android.os.Bundle;
import android.util.Log;import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.platform.comapi.basestruct.GeoPoint;
import com.taocaiku.gaea.common.TckApp;
import com.taocaiku.gaea.domain.Domain;
import com.taocaiku.gaea.domain.context.Container;
import com.taocaiku.gaea.domain.context.TckUrls;
import com.taocaiku.gaea.service.RegionService;
import com.taocaiku.gaea.service.SellerMarketService;/**
 * 手机坐标定位的工具类
 * 
 * @author TCK-001
 * @version 1.0
 */
public final class PointUtil { private PointUtil() {
} private static PointUtil bean = new PointUtil();
private double[] myPoint = new double[3];
private boolean isEditPoint = false; /**
 * 经度
 * */
public static final String LONGITUDE = "longitude"; /**
 * 纬度
 * */
public static final String LATITUDE = "latitude"; /** 天安门的坐标 */
public static final GeoPoint CENTER_POINT = new GeoPoint(
(int) (39.945d * 1E6), (int) (116.404d * 1E6)); /**
 * 单例模式获得bean
 * 
 * @return FileUtil
 */
public static PointUtil get() {
return bean;
} private LocationListener listener = new LocationListener() { public void onStatusChanged(String provider, int status, Bundle extras) {
} public void onProviderEnabled(String provider) {
} public void onProviderDisabled(String provider) {
} public void onLocationChanged(Location location) {
if (location != null) {
double[] old = myPoint;
myPoint = new double[] { location.getLongitude(),
location.getLatitude(), location.getAltitude() };
if (myPoint[0] <= 0 || myPoint[1] <= 0) {
return;
}
if (old[0] != myPoint[0] || old[1] != myPoint[1]) {
if (MapUtil.get().getDistance(old, myPoint) > 500) {
editMemberPoint();
SellerMarketService.get().loadNearby();
//SellerMarketService.get().editDistance();
}
if (MapUtil.get().getDistance(old, myPoint) > 1000
|| ToolUtil.get().isBlank(Container.city)) {
RegionService.get().pointCity();
}
doCallback();
}
}
} }; private BDLocationListener baiduListener = new BDLocationListener() { public void onReceivePoi(BDLocation location) {
if (null == location) {
return;
}
} public void onReceiveLocation(BDLocation location) {
if (location != null) {
double[] old = myPoint;
myPoint = new double[] { location.getLongitude(),
location.getLatitude(), location.getAltitude() };
if (myPoint[0] <= 0 || myPoint[1] <= 0) {
return;
}
if (old[0] != myPoint[0] || old[1] != myPoint[1]) {
if (MapUtil.get().getDistance(old, myPoint) > 500) {
editMemberPoint();
SellerMarketService.get().loadNearby();
//SellerMarketService.get().editDistance();
}
if (MapUtil.get().getDistance(old, myPoint) > 1000
|| ToolUtil.get().isBlank(Container.city)) {
RegionService.get().pointCity();
}
doCallback();
}
}
}
}; // 注册一个普通坐标
@SuppressWarnings("unused")
private void plainReg() {
LocationManager manager = (LocationManager) pointContext
.getSystemService(Context.LOCATION_SERVICE);
boolean isGps = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean isNetWork = manager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGps || !isNetWork) {
Intent GPSIntent = new Intent();
GPSIntent.setClassName("com.android.settings",
"com.android.settings.widget.SettingsAppWidgetProvider");
GPSIntent.addCategory("android.intent.category.ALTERNATIVE");
GPSIntent.setData(Uri.parse("custom:3"));
try {
PendingIntent.getBroadcast(pointContext, 0, GPSIntent, 0)
.send();
} catch (Exception e) {
}
}
String provider = LocationManager.GPS_PROVIDER;
if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);// 获取精准位置
criteria.setCostAllowed(true);// 允许产生开销
criteria.setPowerRequirement(Criteria.POWER_HIGH);// 消耗大的话,获取的频率高
criteria.setSpeedRequired(true);// 手机位置移动
criteria.setAltitudeRequired(true);// 海拔
provider = manager.getBestProvider(criteria, true);// 使用GPS卫星
} else {
provider = LocationManager.NETWORK_PROVIDER;
}
manager.requestLocationUpdates(provider, 1000, 1f, listener);
} // 注册一个百度的坐标
private void baiduReg() {
LocationClient client = new LocationClient(pointContext);
client.registerLocationListener(baiduListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
client.setLocOption(option);
client.start();
} // 更新用户的位置
private void editMemberPoint() {
if (!WebUtil.get().isNet() || null == Container.member || isEditPoint) {
return;
}
new Thread() {
public void run() {
try {
WebUtil web = new WebUtil(Domain.LONG_REQUEST_TIME,
TckUrls.POINT_EDIT_URL, false);
Map<String, Object> map = ToolUtil.get().createMap(
new String[] { LONGITUDE, LATITUDE, "ip" },
new Object[] { myPoint[0], myPoint[1],
web.getLocalIp() });
web.requestTck(map, false);
isEditPoint = true;
} catch (Exception e) {
Log.e(Domain.TAG_NAME, "更新用户的位置", e);
}
}
}.start();
} /**
 * 注册一个周期性坐标(百度坐标和原来的手机坐标都使用)
 */
public void register() {
pointContext = TckApp.get().getApplicationContext();
baiduReg();
//plainReg();
} /**
 * 执行回调事件
 */
private void doCallback() {
if (pointContext instanceof Activity
&& !ToolUtil.get().isBlank(pointCallback)) {
ViewUtil.get().runCallback(
ToolUtil.get().createMap(
new String[] { "callback", "activity" },
new Object[] { pointCallback, pointContext }));
}
} /**
 * 获得手机当前的地理坐标: 经度,纬度,海拔
 * 
 * @return double[]
 */
public double[] getMyPoint() {
return myPoint;
} /**
 * 设置当前容器,如果不设置,默认为CarApp的实例
 * 
 * @param pointContext
 */
public void setPointContext(Context pointContext) {
this.pointContext = pointContext;
} /**
 * 设置导航时的回调事件
 * 
 * @param pointCallback
 */
public void setPointCallback(String pointCallback) {
this.pointCallback = pointCallback;
} private Context pointContext = null;
private String pointCallback = null;}在项目启动的时候注册一下坐标:PointUtil.get().register();
然后就能在程序中的任何地方取手机当前的坐标了:
// 数组中的元素分别为:经度,纬度,海拔
double[] point = PointUtil.get().getMyPoint();需要的权限:
<!-- 允许一个程序访问CellID或WiFi热点来获取粗略的位置 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 使用百度定位服务 -->
    <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" />
    <!-- 使用百度定位服务 -->
    <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" />
<!-- 允许程序打开网络套接字 -->
    <uses-permission android:name="android.permission.INTERNET" />