How to get Latitude and Longitude of the mobile device in android?

前端 未结 8 1425
隐瞒了意图╮
隐瞒了意图╮ 2020-11-22 16:09

How do I get the current Latitude and Longitude of the mobile device in android using location tools?

相关标签:
8条回答
  • 2020-11-22 16:15

    Best way is

    Add permission manifest file

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

    Then you can get GPS location or if GPS location is not available then this function return NETWORK location

        public static Location getLocationWithCheckNetworkAndGPS(Context mContext) {
        LocationManager lm = (LocationManager)
                mContext.getSystemService(Context.LOCATION_SERVICE);
        assert lm != null;
        isGpsEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        isNetworkLocationEnabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
        Location networkLoacation = null, gpsLocation = null, finalLoc = null;
        if (isGpsEnabled)
            if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    
                return null;
            }gpsLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (isNetworkLocationEnabled)
            networkLoacation = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    
        if (gpsLocation != null && networkLoacation != null) {
    
            //smaller the number more accurate result will
            if (gpsLocation.getAccuracy() > networkLoacation.getAccuracy())
                return finalLoc = networkLoacation;
            else
                return finalLoc = gpsLocation;
    
        } else {
    
            if (gpsLocation != null) {
                return finalLoc = gpsLocation;
            } else if (networkLoacation != null) {
                return finalLoc = networkLoacation;
            }
        }
        return finalLoc;
    }
    
    0 讨论(0)
  • 2020-11-22 16:18

    you can got Current latlng using this

    `

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

    `

    0 讨论(0)
  • 2020-11-22 16:26

    Here is the class LocationFinder to find the GPS location. This class will call MyLocation, which will do the business.

    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);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 16:27

    Update 2020: Using Kotlin Coroutine to get Lat, lang & Address of the Device

    This is an old question and most answers are outdated. This is how I do it my apps now:

    This class help to track the device location and return list of Address of device using Geocoding. Put it in some util class

    import android.Manifest
    import android.app.AlertDialog
    import android.content.Context
    import android.content.Intent
    import android.content.pm.PackageManager
    import android.location.*
    import android.os.Bundle
    import android.provider.Settings
    import android.util.Log
    import androidx.core.app.ActivityCompat
    import com.bmw.weatherapp.R
    import kotlinx.coroutines.*
    import java.io.IOException
    import java.lang.ref.WeakReference
    import java.util.*
    import kotlin.coroutines.CoroutineContext
    
    /**
     * Use GPS or Network Provider to get Device Location
     */
    class DeviceLocationTracker(context: Context, deviceLocationListener: DeviceLocationListener) : LocationListener, CoroutineScope {
        private var deviceLocation: Location? = null
        private val context: WeakReference<Context>
        private var locationManager: LocationManager? = null
        private var deviceLocationListener: DeviceLocationListener
        private val job = Job()
        override val coroutineContext: CoroutineContext
            get() = job + Dispatchers.Main
    
        init {
            this.context = WeakReference(context)
            this.deviceLocationListener = deviceLocationListener
            initializeLocationProviders()
        }
    
        private fun initializeLocationProviders() {
            //Init Location Manger if not already initialized
            if (null == locationManager) {
                locationManager = context.get()
                        ?.getSystemService(Context.LOCATION_SERVICE) as LocationManager
            }
            locationManager?.apply {
                // flag for GPS status
                val isGPSEnabled = isProviderEnabled(LocationManager.GPS_PROVIDER)
    
                // flag for network status
                val isNetworkEnabled = isProviderEnabled(LocationManager.PASSIVE_PROVIDER)
    
                //If we have permission
                if (ActivityCompat.checkSelfPermission(context.get()!!, Manifest.permission.ACCESS_FINE_LOCATION)
                        == PackageManager.PERMISSION_GRANTED &&
                        ActivityCompat.checkSelfPermission(context.get()!!, Manifest.permission.ACCESS_COARSE_LOCATION)
                        == PackageManager.PERMISSION_GRANTED) {
    
                    //First Try GPS
                    if (isGPSEnabled) {
                        requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                UPDATE_FREQUENCY_TIME,
                                UPDATE_FREQUENCY_DISTANCE.toFloat(), this@DeviceLocationTracker)
                        deviceLocation = locationManager!!.getLastKnownLocation(LocationManager.GPS_PROVIDER)
                    } else {
                        // Show alert to open GPS
                        context.get()?.apply {
                            AlertDialog.Builder(this)
                                    .setTitle(getString(R.string.title_enable_gps))
                                    .setMessage(getString(R.string.desc_enable_gps))
                                    .setPositiveButton(getString(R.string.btn_settings)
                                    ) { dialog, which ->
                                        val intent = Intent(
                                                Settings.ACTION_LOCATION_SOURCE_SETTINGS)
                                        startActivity(intent)
                                    }.setNegativeButton(getString(R.string.btn_cancel))
                                    { dialog, which -> dialog.cancel() }.show()
                        }
                    }
    
                    //If failed try using NetworkManger
                    if(null==deviceLocation && isNetworkEnabled) {
                        requestLocationUpdates(
                                LocationManager.PASSIVE_PROVIDER,
                                0, 0f,
                                this@DeviceLocationTracker)
                        deviceLocation = locationManager!!.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
                    }
                }
            }
        }
    
        /**
         * Stop using GPS listener
         * Must call this function to stop using GPS
         */
        fun stopUpdate() {
            if (locationManager != null) {
                locationManager!!.removeUpdates(this@DeviceLocationTracker)
            }
        }
    
        override fun onLocationChanged(newDeviceLocation: Location) {
            deviceLocation = newDeviceLocation
            launch(Dispatchers.Main) {
                withContext(Dispatchers.IO) {
                    var addressList: List<Address?>? = null
                    try {
                        addressList = Geocoder(context.get(),
                                Locale.ENGLISH).getFromLocation(
                                newDeviceLocation.latitude,
                                newDeviceLocation.longitude,
                                1)
                        deviceLocationListener.onDeviceLocationChanged(addressList)
                        Log.i(TAG, "Fetch address list"+addressList)
    
                    } catch (e: IOException) {
                        Log.e(TAG, "Failed Fetched Address List")
                    }
                }
            }
        }
    
        override fun onProviderDisabled(provider: String) {}
        override fun onProviderEnabled(provider: String) {}
        override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
        interface DeviceLocationListener {
            fun onDeviceLocationChanged(results: List<Address>?)
        }
    
        companion object {
            // The minimum distance to change Updates in meters
            private const val UPDATE_FREQUENCY_DISTANCE: Long = 1 // 10 meters
    
            // The minimum time between updates in milliseconds
            private const val UPDATE_FREQUENCY_TIME: Long = 1 // 1 minute
            private val TAG = DeviceLocationTracker::class.java.simpleName
        }
    }
    

    Add Strings for alert dialog in case GPS is disabled

       <string name="title_enable_gps">Enable GPS</string>
       <string name="desc_enable_gps">GPS is not enabled. Do you want to go to settings menu?</string>
        <string name="btn_settings">Open Settings</string>
        <string name="btn_cancel">Cancel</string>
    

    Add these permission in your Android manifest and request them in app start

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_GPS" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

    Usage

    Implement DeviceLocationListener in your Activity/Fragment class

      class MainActivity : AppCompatActivity, DeviceLocationTracker.DeviceLocationListener {
        
    

    Override onDeviceLocationChanged callback. You will get current location in onDeviceLocationChanged

      override fun onDeviceLocationChanged(results: List<Address>?) {
            val currntLocation = results?.get(0);
            currntLocation?.apply {
                 currentlLat = latitude
                 currentLng = longitude
                 Country = countryCode
                 cityName = getAddressLine(0)
              
            }
    
        }
    

    To start tracking create a DeviceLocationTracker object in onCreate method of your. Pass the Activity as Context & this as DeviceLocationListener.

    private lateinit var deviceLocationTracker: DeviceLocationTracker
    
    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            ...
            deviceLocationTracker= DeviceLocationTracker(this, this)
    

    That is it, now you will start to get location update in onDeviceLocationChanged.

    0 讨论(0)
  • 2020-11-22 16:30

    With google things changes very often: non of the previous answers worked for me.

    based on this google training here is how you do it using

    fused location provider

    this requires Set Up Google Play Services

    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

    in you activity

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

    And this method

     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");
        }
    }
    
    0 讨论(0)
  • 2020-11-22 16:34

    Use the LocationManager.

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

    The call to getLastKnownLocation() doesn't block - which means it will return null if no position is currently available - so you probably want to have a look at passing a LocationListener to the requestLocationUpdates() method instead, which will give you asynchronous updates of your location.

    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);
    

    You'll need to give your application the ACCESS_FINE_LOCATION permission if you want to use GPS.

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

    You may also want to add the ACCESS_COARSE_LOCATION permission for when GPS isn't available and select your location provider with the getBestProvider() method.

    0 讨论(0)
提交回复
热议问题