首页 文章

如何在Android中获取移动设备的纬度和经度?

提问于
浏览
152

如何使用位置工具获取Android中移动设备的当前纬度和经度?

6 回答

  • 18

    使用LocationManager .

    LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    double longitude = location.getLongitude();
    double latitude = location.getLatitude();
    

    getLastKnownLocation() 的调用不会阻止 - 这意味着如果当前没有位置,它将返回 null - 所以你可能想看看将LocationListener传递给requestLocationUpdates() method,这将为您提供位置的异步更新 .

    private final LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            longitude = location.getLongitude();
            latitude = location.getLatitude();
        }
    }
    
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
    

    如果你想使用GPS,你需要给你的应用程序ACCESS_FINE_LOCATION permission .

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

    您可能还想在GPS不可用时添加ACCESS_COARSE_LOCATION permission,并使用getBestProvider() method选择您的位置提供商 .

  • 11

    这是找到GPS位置的类 LocationFinder . 这个类将调用 MyLocation ,它将开展业务 .

    LocationFinder

    public class LocationFinder extends Activity {
    
        int increment = 4;
        MyLocation myLocation = new MyLocation();
    
        // private ProgressDialog dialog;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.intermediat);
            myLocation.getLocation(getApplicationContext(), locationResult);
    
            boolean r = myLocation.getLocation(getApplicationContext(),
                locationResult);
    
            startActivity(new Intent(LocationFinder.this,
            // Nearbyhotelfinder.class));
                GPSMyListView.class));
            finish();
        }
    
        public LocationResult locationResult = new LocationResult() {
    
            @Override
            public void gotLocation(Location location) {
                // TODO Auto-generated method stub
                double Longitude = location.getLongitude();
                double Latitude = location.getLatitude();
    
                Toast.makeText(getApplicationContext(), "Got Location",
                    Toast.LENGTH_LONG).show();
    
                try {
                    SharedPreferences locationpref = getApplication()
                        .getSharedPreferences("location", MODE_WORLD_READABLE);
                    SharedPreferences.Editor prefsEditor = locationpref.edit();
                    prefsEditor.putString("Longitude", Longitude + "");
                    prefsEditor.putString("Latitude", Latitude + "");
                    prefsEditor.commit();
                    System.out.println("SHARE PREFERENCE ME PUT KAR DIYA.");
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
    
        // handler for the background updating
    
    }
    

    MyLocation

    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){}
    
            //Toast.makeText(context, gps_enabled+" "+network_enabled,     Toast.LENGTH_LONG).show();
    
            //don't start listeners if no provider is enabled
            if(!gps_enabled && !network_enabled)
                return false;
    
            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(), 10000);
        //    Toast.makeText(context, " Yaha Tak AAya", Toast.LENGTH_LONG).show();
            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() {
    
                //Context context = getClass().getgetApplicationContext();
                 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);
        }
    }
    
  • 39

    随着 google 事情经常发生变化:以前的答案都不适用于我 .

    April 2016

    基于this google training这里是你如何使用它

    融合位置提供商

    这需要设置Google Play服务

    Activity class

    public class GPSTrackerActivity extends AppCompatActivity implements
        GoogleApiClient.ConnectionCallbacks,     
     GoogleApiClient.OnConnectionFailedListener {
    
    private GoogleApiClient mGoogleApiClient;
    Location mLastLocation;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
        }
    
    }
    
    protected void onStart() {
        mGoogleApiClient.connect();
        super.onStart();
    }
    
    protected void onStop() {
        mGoogleApiClient.disconnect();
        super.onStop();
    }
    
    @Override
    public void onConnected(Bundle bundle) {
        try {
    
            mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                    mGoogleApiClient);
            if (mLastLocation != null) {
                Intent intent = new Intent();
                intent.putExtra("Longitude", mLastLocation.getLongitude());
                intent.putExtra("Latitude", mLastLocation.getLatitude());
                setResult(1,intent);
                finish();
    
            }
        } catch (SecurityException e) {
    
        }
    
    }
    
    @Override
    public void onConnectionSuspended(int i) {
    
    }
    
    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
    
    }
    }
    

    usage

    在你的活动中

    Intent intent = new Intent(context, GPSTrackerActivity.class);
        startActivityForResult(intent,1);
    

    而这种方法

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1){
            Bundle extras = data.getExtras();
            Double longitude = extras.getDouble("Longitude");
            Double latitude = extras.getDouble("Latitude");
        }
    }
    
  • 4

    你可以使用这个获得当前的latlng

    `

    public class MainActivity extends ActionBarActivity {
      private LocationManager locationManager;
      private String provider;
      private MyLocationListener mylistener;
      private Criteria criteria;
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    
                 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                  // Define the criteria how to select the location provider
                  criteria = new Criteria();
                  criteria.setAccuracy(Criteria.ACCURACY_COARSE);   //default
    
                  // user defines the criteria
    
                  criteria.setCostAllowed(false); 
                  // get the best provider depending on the criteria
                  provider = locationManager.getBestProvider(criteria, false);
    
                  // the last known location of this provider
                  Location location = locationManager.getLastKnownLocation(provider);
    
                  mylistener = new MyLocationListener();
    
                  if (location != null) {
                      mylistener.onLocationChanged(location);
                  } else {
                      // leads to the settings because there is no last known location
                      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                      startActivity(intent);
                  }
                  // location updates: at least 1 meter and 200millsecs change
                  locationManager.requestLocationUpdates(provider, 200, 1, mylistener);
                String a=""+location.getLatitude();
                Toast.makeText(getApplicationContext(), a, 222).show();
    
    }
    
    private class MyLocationListener implements LocationListener {
    
          @Override
          public void onLocationChanged(Location location) {
            // Initialize the location fields
    
    
    
              Toast.makeText(MainActivity.this,  ""+location.getLatitude()+location.getLongitude(),
                        Toast.LENGTH_SHORT).show()  
    
          }
    
          @Override
          public void onStatusChanged(String provider, int status, Bundle extras) {
              Toast.makeText(MainActivity.this, provider + "'s status changed to "+status +"!",
                        Toast.LENGTH_SHORT).show();
          }
    
          @Override
          public void onProviderEnabled(String provider) {
              Toast.makeText(MainActivity.this, "Provider " + provider + " enabled!",
                Toast.LENGTH_SHORT).show();
    
          }
    
          @Override
          public void onProviderDisabled(String provider) {
              Toast.makeText(MainActivity.this, "Provider " + provider + " disabled!",
                Toast.LENGTH_SHORT).show();
          }
      }
    

    `

  • 1

    上面的解决方案也是正确的,但是如果location为null,那么它会使应用程序崩溃或无法正常工作 . 获得android的Latitude和Longitude的最佳方法是:

    Geocoder geocoder;
         String bestProvider;
         List<Address> user = null;
         double lat;
         double lng;
    
        LocationManager lm = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
    
         Criteria criteria = new Criteria();
         bestProvider = lm.getBestProvider(criteria, false);
         Location location = lm.getLastKnownLocation(bestProvider);
    
         if (location == null){
             Toast.makeText(activity,"Location Not found",Toast.LENGTH_LONG).show();
          }else{
            geocoder = new Geocoder(activity);
            try {
                user = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
            lat=(double)user.get(0).getLatitude();
            lng=(double)user.get(0).getLongitude();
            System.out.println(" DDD lat: " +lat+",  longitude: "+lng);
    
            }catch (Exception e) {
                    e.printStackTrace();
            }
        }
    
  • 296

    @CommonsWare的答案对我有用但是我不得不修改

    public LocationResult locationResult = new LocationResult() {
    

    public MyLocation.LocationResult locationResult = new MyLocation.LocationResult() {
    

相关问题