解决方案 »

  1.   

    可以先判断下手机支持的定位的服务字符串,是否包含LocationManager.NETWORK_PROVIDER,然后再判断服务是否可用,在获取位置信息,如果返回为空的话,可以采用通过百度API获取位置的方式,我现在碰到的问题是,获取过来的经纬度信息不准,误差很大。
      

  2.   

    /**
     * 手机坐标定位的工具类
     * @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();
    }
    }
    }
    };

    // 注册一个普通坐标
    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 (!ViewUtil.get().isNet() || null == Container.member || isEditPoint) {return;}
    new Thread() {
    public void run() {
    try {
    ToolUtil tool = new ToolUtil(Domain.LONG_REQUEST_TIME, TckUrls.POINT_EDIT_URL, false);
    Map<String, Object> map = tool.createMap(new String[] { LONGITUDE, LATITUDE, "ip" }, 
    new Object[] { myPoint[0], myPoint[1], tool.getLocalIp() });
    tool.requestTck(map, false);
    isEditPoint = true;
    } catch (Exception e) {
    Log.e("AbstractActivity", "更新用户的位置", 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;}