【问题标题】:How to use both GPS and Network Provider to get current location Latitude and Longitude values in Android如何同时使用 GPS 和网络提供商在 Android 中获取当前位置的纬度和经度值
【发布时间】:2012-04-24 17:27:14
【问题描述】:

在我的 Android 应用程序中,我想使用 GPS 提供程序和网络提供程序进行 5 秒的位置更新。首先,我想使用 GPS 提供者(因为它给出了准确的结果),如果 GPS 提供者返回纬度和经度为 0.0 和 0.0,那么我想使用网络提供者,但我不想同时使用这两个提供者同时地。有什么建议吗?

【问题讨论】:

    标签: android networking gps location-provider


    【解决方案1】:
    package loca.loca;
    
    import java.util.Timer;
    import java.util.TimerTask;
    import android.app.Activity;
    import android.content.Context;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.widget.Toast;
    
    
    public class LocationActivity extends Activity {
    
        double x,y;
    
        Timer timer;
        LocationManager lm;
        boolean gps_enabled = false;
        boolean network_enabled = false;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
    
                lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    
    
    
                gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
                network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
    
    
            if (!gps_enabled && !network_enabled) {  Context context = getApplicationContext();
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(context, "nothing is enabled", duration);
                toast.show();
    
            }
    
    
    
    
            if (gps_enabled)
                lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
                        locationListenerGps);
            if (network_enabled)
                lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,
                        locationListenerNetwork);
             timer=new Timer();
             timer.schedule(new GetLastLocation(), 20000);
    
        }
    
        LocationListener locationListenerGps = new LocationListener() {
            public void onLocationChanged(Location location) {
                timer.cancel();
                x =location.getLatitude();
                y = location.getLongitude();
                lm.removeUpdates(this);
                lm.removeUpdates(locationListenerNetwork);
    
                Context context = getApplicationContext();
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(context, "gps enabled "+x + "\n" + y, duration);
                toast.show();
            }
    
            public void onProviderDisabled(String provider) {
            }
    
            public void onProviderEnabled(String provider) {
            }
    
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
        };
    
        LocationListener locationListenerNetwork = new LocationListener() {
            public void onLocationChanged(Location location) {
                timer.cancel();
                x = location.getLatitude();
                y = location.getLongitude();
                lm.removeUpdates(this);
                lm.removeUpdates(locationListenerGps);
    
                Context context = getApplicationContext();
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(context, "network enabled"+x + "\n" + y, duration);
                toast.show();
            }
    
            public void onProviderDisabled(String provider) {
            }
    
            public void onProviderEnabled(String provider) {
            }
    
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
        };
    
        class GetLastLocation extends TimerTask {
            @Override
            public void run() {
                 lm.removeUpdates(locationListenerGps);
                 lm.removeUpdates(locationListenerNetwork);
    
                 Location net_loc=null, gps_loc=null;
                 if(gps_enabled)
                     gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                 if(network_enabled)
                     net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    
                 //if there are both values use the latest one
                 if(gps_loc!=null && net_loc!=null){
                     if(gps_loc.getTime()>net_loc.getTime())
                    {x = gps_loc.getLatitude();
                    y = gps_loc.getLongitude();
                      Context context = getApplicationContext();
                        int duration = Toast.LENGTH_SHORT;
                        Toast toast = Toast.makeText(context, "gps lastknown "+x + "\n" + y, duration);
                        toast.show();
                    }
                     else
                    {x = net_loc.getLatitude();
                    y = net_loc.getLongitude();
                    Context context = getApplicationContext();
                    int duration = Toast.LENGTH_SHORT;
                    Toast toast = Toast.makeText(context, "network lastknown "+x + "\n" + y, duration);
                    toast.show();
    
                    }
    
                 }
    
                 if(gps_loc!=null){
                      {x = gps_loc.getLatitude();
                    y = gps_loc.getLongitude();
                      Context context = getApplicationContext();
                        int duration = Toast.LENGTH_SHORT;
                        Toast toast = Toast.makeText(context, "gps lastknown "+x + "\n" + y, duration);
                        toast.show();
                      }
    
                 }
                 if(net_loc!=null){
                    {x = net_loc.getLatitude();
                    y = net_loc.getLongitude();
                  Context context = getApplicationContext();
                  int duration = Toast.LENGTH_SHORT;
                  Toast toast = Toast.makeText(context, "network lastknown "+x + "\n" + y, duration);
                    toast.show();
    
                    }
                 }
                Context context = getApplicationContext();
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(context, "no last know avilable", duration);
                toast.show();
    
    }
    }}
    

    【讨论】:

    • 您有什么理由为两者使用不同的 LocationListener 吗?我可以只使用一个,然后检查 onLocationChange() 它正在使用哪个提供商吗?
    • 应该为每个位置提供者使用不同的 LocationListener 对象。否则将使用最后分配的提供者。
    【解决方案2】:
      public class MyLocation {
        Timer timer1;
        LocationManager lm;
        LocationResult locationResult;
        boolean gps_enabled=false;
        boolean network_enabled=false;`
    
        public boolean getLocation(Context context, LocationResult result)
        {
            //I use LocationResult callback class to pass location value from MyLocation to user code.
            locationResult=result;
            if(lm==null)
                lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    
            //exceptions will be thrown if provider is not permitted.
            try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){}
            try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}
    
            //don't start listeners if no provider is enabled
            if(!gps_enabled && !network_enabled)
                return false;
            try{
                if(gps_enabled)
                    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
                if(network_enabled)
                    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
                timer1=new Timer();
                timer1.schedule(new GetLastLocation(), 30000);
            }catch(Exception x){
                return false;
            }
            return true;
        }
    
        LocationListener locationListenerGps = new LocationListener() {
            public void onLocationChanged(Location location) {
                timer1.cancel();
                locationResult.gotLocation(location);
                lm.removeUpdates(this);
                lm.removeUpdates(locationListenerNetwork);
            }
            public void onProviderDisabled(String provider) {}
            public void onProviderEnabled(String provider) {}
            public void onStatusChanged(String provider, int status, Bundle extras) {}
        };
    
        LocationListener locationListenerNetwork = new LocationListener() {
            public void onLocationChanged(Location location) {
                timer1.cancel();
                locationResult.gotLocation(location);
                lm.removeUpdates(this);
                lm.removeUpdates(locationListenerGps);
            }
            public void onProviderDisabled(String provider) {}
            public void onProviderEnabled(String provider) {}
            public void onStatusChanged(String provider, int status, Bundle extras) {}
        };
    
        class GetLastLocation extends TimerTask {
            @Override
            public void run() {
                lm.removeUpdates(locationListenerGps);
                lm.removeUpdates(locationListenerNetwork);
    
                Location net_loc=null, gps_loc=null;
                if(gps_enabled)
                    gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if(network_enabled)
                    net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    
                //if there are both values use the latest one
                if(gps_loc!=null && net_loc!=null){
                    if(gps_loc.getTime()>net_loc.getTime())
                        locationResult.gotLocation(gps_loc);
                    else
                        locationResult.gotLocation(net_loc);
                    return;
                }
    
                if(gps_loc!=null){
                    locationResult.gotLocation(gps_loc);
                    return;
                }
                if(net_loc!=null){
                    locationResult.gotLocation(net_loc);
                    return;
                }
                locationResult.gotLocation(null);
            }
        }
    
        public static abstract class LocationResult{
            public abstract void gotLocation(Location location);
        }
    } 
    

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

    final MyLocation myLocation = new MyLocation();
    
                    Handler mHandler = new Handler(Looper.getMainLooper());
                    mHandler.post(new Runnable() {
                        public void run() {
                            locationResult = new LocationResult(){
                                @Override
                                public void gotLocation(final Location location){
                                    //Got the location!
                                    try{
                                        Methods.savePre(context, ""+location.getLatitude(), "LATITUDE");
                                        Methods.savePre(context, ""+location.getLongitude(), "LONGITUDE");
                                    }catch(Exception x){
                                        x.getMessage();
                                    }
                                    Got_loc= true;
                                    //                              String geoAddress  = "geo:" + location.getLatitude() + ","+ location.getLongitude() + "?z=15";
                                    //                              Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(geoAddress));
                                    //                              context.startActivity(intent);
                                }
                            };
                            myLocation.getLocation(context, locationResult);
                        }
                    });
                    while(!Got_loc){
                        Thread.sleep(150);
                    }
    
                    Loc = Methods.getPref(context, "LATITUDE") + "%%" + Methods.getPref
    

    【讨论】:

      【解决方案3】:

      最简单的方法是为 gps 和网络创建两个不同的LocationListener 和两个请求位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-31
        • 2017-05-09
        • 2012-07-08
        • 1970-01-01
        相关资源
        最近更新 更多