通过gps,网络和未连接模式获取当前位置的一般类,并在找到后停止

时间:2014-04-11 21:49:46

标签: android location locationmanager

当然我的问题是重复的。但我无法找到解决方案的好答案。 我想编写一个自定义通用类,可以通过位置管理器找到当前位置并启用自己的检测gps或启用网络,或者在设备没有gps或网络启用时使用缓存和存储位置。最重要的是在找到第一个位置之后停止工作。但我为它做了这些工作:1-创建两个locationlistener类(GPSListener和networkListner):

public class GPSListener implements LocationListener {

LocationManager locationManager=null;
public Boolean found=false;
public Location mainLocation=null;
@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    found=true;
    mainLocation= location;
}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}



}

public class NetworkListener implements LocationListener {

LocationManager locationManager=null;
public Boolean found=false;
public Location mainLocation=null;
@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    found=true;
    mainLocation=location;

}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}

然后我在我的活动中使用这些类:

LatLng result = null;
    final LocationManager locationManager = (LocationManager) this
            .getSystemService(Context.LOCATION_SERVICE);


    if (DeviceHelper.IsGPSEnabled()) {

        GPSListener gpsListener = new GPSListener();

        // if(gpsListener.found)
        // {
        if (gpsListener.mainLocation != null) {
            ToastHelper.Show(this,
                    "GPS : " + gpsListener.mainLocation.toString());
            gpsListener = null;
            result = new LatLng(gpsListener.mainLocation.getLatitude(),
                    gpsListener.mainLocation.getLongitude());
        }
        // }
        locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, 0, 0, gpsListener);
    }

    else if (DeviceHelper.HasConnect()) {

        NetworkListener netListener = new NetworkListener();

        // if(netListener.found)
        // {
        if (netListener.mainLocation != null) {
            ToastHelper.Show(this,
                    "NETWORK : " + netListener.mainLocation.toString());
            netListener = null;
            result = new LatLng(netListener.mainLocation.getLatitude(),
                    netListener.mainLocation.getLongitude());
        }
        // }
        locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, 0, 0, netListener);
    } else {
        ;
        Location loc = LocationHelper.getLastKnownLoaction(false);
        if (loc != null) {
            ToastHelper.Show(this, "LAST : " + loc.toString());
            result = new LatLng(loc.getLatitude(), loc.getLongitude());
        }
    }


    if (result != null) {
        LogHelper.Add("LL", String.valueOf(result.latitude));
        LocationHelper.MyLatLng = result;
        StaticObjects.mainMap.addMarker(new MarkerOptions().position(result));
        MapHelper.CameraGo( result, 15);
    } else {
        LogHelper.Add("ERR:", "NULL");

}

我知道这不起作用,因为经理无法找到我显示找到位置的地方之前的好时光。完全我想编写一个通用类来查找当找到第一个位置时可以停止的当前位置。

1 个答案:

答案 0 :(得分:0)

首先,您不需要2个课程来收听GPS-Glonass和网络更新。您只能使用一个对象作为两个提供程序的侦听器 - 因为可以从Location对象轻松获取提供程序:

if(location.getProvider().equals(LocationManager.GPS_PROVIDER)){
    // it is GPS
} else if (location.getProvider().equals(LocationManager.NETWORK_PROVIDER)){
    // it is Network
}

其次,要了解提供商的状态,您应该实施LocationListener' onStatusChanged()回调。如果您订阅LocationListener时提供程序不可用,则立即调用此回调:

 @Override
 public void onStatusChanged(String provider, int status, Bundle extras) {
     if (provider.equals(LocationManager.GPS_PROVIDER) 
         && (status == LocationProvider.OUT_OF_SERVICE || status == LocationProvider.TEMPORARILY_UNAVAILABLE)){
         // gps is unavailable 
     } else if  (provider.equals(LocationManager.NETWORK_PROVIDER) 
         && (status == LocationProvider.OUT_OF_SERVICE || status == LocationProvider.TEMPORARILY_UNAVAILABLE)){
         // network provider is unavailable 
     }
 }

第三,要从位置更新中取消订阅您的对象,请使用:

 locationManager.removeUpdates(locationListener);

如果没有其他应用需要,这将停止获取位置更新并关闭GPS-Glonass定位服务。