How do I get the current GPS location programmatically in Android?

前端 未结 22 2566
梦谈多话
梦谈多话 2020-11-21 04:42

I need to get my current location using GPS programmatically. How can i achieve it?

相关标签:
22条回答
  • 2020-11-21 04:49

    Getting location updates requires lots of bolierplate code in Android, You need to take care of

    • Google Play services availablity Check,
    • Update Google play Service if it is old or not available
    • Dialog Creation of GoogleApiClient and its callbacks connected,disconnected etc.
    • Stopping and releasing resources for location updates
    • Handling Location permission scenarios
    • Checking Location services are On or Off
    • Getting lastknown location is not so easy either
    • Fallback to last known location if not getting location after certain duration

    To ease out all these steps i have created Android-EasyLocation (small android library) which will take care all this stuff and you can focus on business logic.

    All you need is extend EasyLocationActivity and this

    requestSingleLocationFix(easyLocationRequest);
    

    or

    requestLocationUpdates(easyLocationRequest);
    

    Checkout sample app and steps needed here at https://github.com/akhgupta/Android-EasyLocation

    0 讨论(0)
  • 2020-11-21 04:50

    I have created a small application with step by step description to get current location's GPS coordinates.

    Complete example source code is in Get Current Location coordinates , City name - in Android.


    See how it works:

    • All we need to do is add this permission in the manifest file:

      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      
    • And create a LocationManager instance like this:

      LocationManager locationManager = (LocationManager)
      getSystemService(Context.LOCATION_SERVICE);
      
    • Check if GPS is enabled or not.

    • And then implement LocationListener and get coordinates:

      LocationListener locationListener = new MyLocationListener();
      locationManager.requestLocationUpdates(
      LocationManager.GPS_PROVIDER, 5000, 10, locationListener);
      
    • Here is the sample code to do so


    /*---------- Listener class to get coordinates ------------- */
    private class MyLocationListener implements LocationListener {
    
        @Override
        public void onLocationChanged(Location loc) {
            editLocation.setText("");
            pb.setVisibility(View.INVISIBLE);
            Toast.makeText(
                    getBaseContext(),
                    "Location changed: Lat: " + loc.getLatitude() + " Lng: "
                        + loc.getLongitude(), Toast.LENGTH_SHORT).show();
            String longitude = "Longitude: " + loc.getLongitude();
            Log.v(TAG, longitude);
            String latitude = "Latitude: " + loc.getLatitude();
            Log.v(TAG, latitude);
    
            /*------- To get city name from coordinates -------- */
            String cityName = null;
            Geocoder gcd = new Geocoder(getBaseContext(), Locale.getDefault());
            List<Address> addresses;
            try {
                addresses = gcd.getFromLocation(loc.getLatitude(),
                        loc.getLongitude(), 1);
                if (addresses.size() > 0) {
                    System.out.println(addresses.get(0).getLocality());
                    cityName = addresses.get(0).getLocality();
                }
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            String s = longitude + "\n" + latitude + "\n\nMy Current City is: "
                + cityName;
            editLocation.setText(s);
        }
    
        @Override
        public void onProviderDisabled(String provider) {}
    
        @Override
        public void onProviderEnabled(String provider) {}
    
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    }
    

    0 讨论(0)
  • 2020-11-21 04:52

    You can find the location either by GPS_PROVIDER or NETWORK_PROVIDER.

    Overview of location services in Android.

    Here is one example which try to find the location using GPS. If your GPS is not available then try to use network for find the location.

    GPSTracker.java

     public class GPSTracker extends Service implements LocationListener {
    
        private final Context mContext;
    
        // Flag for GPS status
        boolean isGPSEnabled = false;
    
        // Flag for network status
        boolean isNetworkEnabled = false;
    
        // Flag for GPS status
        boolean canGetLocation = false;
    
        Location location; // Location
        double latitude; // Latitude
        double longitude; // Longitude
    
        // The minimum distance to change Updates in meters
        private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
    
        // The minimum time between updates in milliseconds
        private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
    
        // Declaring a Location Manager
        protected LocationManager locationManager;
    
        public GPSTracker(Context context) {
            this.mContext = context;
            getLocation();
        }
    
        public Location getLocation() {
            try {
                locationManager = (LocationManager) mContext
                        .getSystemService(LOCATION_SERVICE);
    
                // Getting GPS status
                isGPSEnabled = locationManager
                        .isProviderEnabled(LocationManager.GPS_PROVIDER);
    
                // Getting network status
                isNetworkEnabled = locationManager
                        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
                if (!isGPSEnabled && !isNetworkEnabled) {
                    // No network provider is enabled
                } else {
                    this.canGetLocation = true;
                    if (isNetworkEnabled) {
                        locationManager.requestLocationUpdates(
                                LocationManager.NETWORK_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("Network", "Network");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                    // If GPS enabled, get latitude/longitude using GPS Services
                    if (isGPSEnabled) {
                        if (location == null) {
                            locationManager.requestLocationUpdates(
                                    LocationManager.GPS_PROVIDER,
                                    MIN_TIME_BW_UPDATES,
                                    MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                            Log.d("GPS Enabled", "GPS Enabled");
                            if (locationManager != null) {
                                location = locationManager
                                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                if (location != null) {
                                    latitude = location.getLatitude();
                                    longitude = location.getLongitude();
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
    
            return location;
        }
    
    
        /**
         * Stop using GPS listener
         * Calling this function will stop using GPS in your app.
         * */
        public void stopUsingGPS(){
            if(locationManager != null){
                locationManager.removeUpdates(GPSTracker.this);
            }
        }
    
    
        /**
         * Function to get latitude
         * */
        public double getLatitude(){
            if(location != null){
                latitude = location.getLatitude();
            }
    
            // return latitude
            return latitude;
        }
    
    
        /**
         * Function to get longitude
         * */
        public double getLongitude(){
            if(location != null){
                longitude = location.getLongitude();
            }
    
            // return longitude
            return longitude;
        }
    
        /**
         * Function to check GPS/Wi-Fi enabled
         * @return boolean
         * */
        public boolean canGetLocation() {
            return this.canGetLocation;
        }
    
    
        /**
         * Function to show settings alert dialog.
         * On pressing the Settings button it will launch Settings Options.
         * */
        public void showSettingsAlert(){
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
    
            // Setting Dialog Title
            alertDialog.setTitle("GPS is settings");
    
            // Setting Dialog Message
            alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
    
            // On pressing the Settings button.
            alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,int which) {
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    mContext.startActivity(intent);
                }
            });
    
            // On pressing the cancel button
            alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
                }
            });
    
            // Showing Alert Message
            alertDialog.show();
        }
    
    
        @Override
        public void onLocationChanged(Location location) {
        }
    
    
        @Override
        public void onProviderDisabled(String provider) {
        }
    
    
        @Override
        public void onProviderEnabled(String provider) {
        }
    
    
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    
    
        @Override
        public IBinder onBind(Intent arg0) {
            return null;
        }
    }
    

    Activity -AndroidGPSTrackingActivity.java

        public class AndroidGPSTrackingActivity extends Activity {
    
        Button btnShowLocation;
    
        // GPSTracker class
        GPSTracker gps;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            btnShowLocation = (Button) findViewById(R.id.btnShowLocation);
    
            // Show location button click event
            btnShowLocation.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    // Create class object
                    gps = new GPSTracker(AndroidGPSTrackingActivity.this);
    
                    // Check if GPS enabled
                    if(gps.canGetLocation()) {
    
                        double latitude = gps.getLatitude();
                        double longitude = gps.getLongitude();
    
                        // \n is for new line
                        Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
                    } else {
                        // Can't get location.
                        // GPS or network is not enabled.
                        // Ask user to enable GPS/network in settings.
                        gps.showSettingsAlert();
                    }
                }
            });
        }
    }
    

    Layout- main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <Button android:id="@+id/btnShowLocation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Show Location"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true"/>
    </RelativeLayout>
    

    AndroidManifest.xml

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    
    0 讨论(0)
  • 2020-11-21 04:53

    If you are creating new location projects for Android you should use the new Google Play location services. It is much more accurate and much simpler to use.

    I have been working on an open source GPS tracker project, GpsTracker, for several years. I recently updated it to handle periodic updates from Android, iOS, Windows Phone and Java ME cell phones. It is fully functional and does what you need and has the MIT License.

    The Android project within GpsTracker uses the new Google Play services and there are also two server stacks (ASP.NET and PHP) to allow you to track those phones.

    0 讨论(0)
  • 2020-11-21 04:53

    I have published a small library that can make it easy to get location data in Android, it even takes care of Android M runtime permissions.

    You might check it out here: https://github.com/julioromano/RxLocation and use it or its source code as examples for your implementation.

    0 讨论(0)
  • 2020-11-21 04:54

    Get location of gps by -

    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    
    LocationListener locationListener = new LocationListener() 
    {
    
                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void onProviderEnabled(String provider) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void onProviderDisabled(String provider) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void onLocationChanged(Location location) {
                    // TODO Auto-generated method stub
                    double latitude = location.getLatitude();
                    double longitude = location.getLongitude();
                    double speed = location.getSpeed(); //spedd in meter/minute
                    speed = (speed*3600)/1000;      // speed in km/minute               Toast.makeText(GraphViews.this, "Current speed:" + location.getSpeed(),Toast.LENGTH_SHORT).show();
                }
            };
    
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    
    }
    
    0 讨论(0)
提交回复
热议问题