Как использовать GPS и сетевой провайдер для получения текущих значений Локатор и долгота в Android

В своем приложении для Android я хочу использовать как провайдера GPS, так и поставщика сети для обновления местоположения в течение 5 секунд. Во-первых, я хотел бы использовать GPS-провайдера (потому что он дает точные результаты), и если поставщик GPS вернет широту и долготу в 0.0 и 0.0, я хочу использовать сетевой провайдер, но я не хочу использовать обоих поставщиков одновременно. Какие-либо предложения?

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(); } }} 
  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 в 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 

Venkat Проверьте это

Вы также можете использовать критерии для получения наилучшего результата в соответствии с вашими потребностями