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

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

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

相关标签:
22条回答
  • 2020-11-21 05:01

    Simple Find Write Code in On Location Method

    public void onLocationChanged(Location location) {
        if (mCurrLocationMarker != null) {
            mCurrLocationMarker.remove();
        }
    
    
        //Place current location marker
        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(latLng);
        markerOptions.title("Current Position");
        markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
        mCurrLocationMarker = mMap.addMarker(markerOptions);
    
        //move map camera
        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(18));
    
        PolylineOptions pOptions = new PolylineOptions()
                .width(5)
                .color(Color.GREEN)
                .geodesic(true);
        for (int z = 0; z < routePoints.size(); z++) {
            LatLng point = routePoints.get(z);
            pOptions.add(point);
        }
        line = mMap.addPolyline(pOptions);
        routePoints.add(latLng);
    }
    
    0 讨论(0)
  • 2020-11-21 05:02

    For just location checking you can use following code. You can put it in your onStart() of main activity and display alert dialog if return is false.

    private boolean isLocationAccurate()
        {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
            {
                String provider = Settings.Secure
                        .getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
                if (provider != null && !provider.contains("gps"))
                {
                    return false;
                }
            }
            else
            {
                try
                {
                    int status = Settings.Secure
                            .getInt(this.getContentResolver(), Settings.Secure.LOCATION_MODE);
                    if (status != Settings.Secure.LOCATION_MODE_HIGH_ACCURACY)
                    {
                        return false;
                    }
                }
                catch (Settings.SettingNotFoundException e)
                {
                    Log.e(TAG, e.getMessage());
                }
            }
    
            return true;
        }
    
    0 讨论(0)
  • 2020-11-21 05:02

    I will recommend using Smart Location Library
    Very simple to use and it wraps the location logic nicely.

    For starting the location service:

    SmartLocation.with(context).location()
        .start(new OnLocationUpdatedListener() { ... });
    

    If you just want to get a single location (not periodic) you can just use the oneFix modifier. Example:

    SmartLocation.with(context).location()
        .oneFix()
        .start(new OnLocationUpdatedListener() { ... });
    
    0 讨论(0)
  • 2020-11-21 05:03

    You need to use latest/newest

    GoogleApiClient Api

    Basically what you need to do is:

    private GoogleApiClient mGoogleApiClient;
    mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
    

    Then

    @Override
        public void onConnected(Bundle connectionHint) {
            mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                    mGoogleApiClient);
            if (mLastLocation != null) {
                mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
                mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));
            }
        }
    

    for the most accurate and reliable location. See my post here:

    https://stackoverflow.com/a/33599228/2644905

    Do not use LocationListener which is not accurate and has delayed response. To be honest this is easier to implement. Also read documentation: https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient

    0 讨论(0)
  • 2020-11-21 05:06

    I have got very accurate location using FusedLocationProviderClient
    (Google Play services required)

    Permissions Required

    android.permission.ACCESS_FINE_LOCATION

    android.permission.ACCESS_COARSE_LOCATION

    Dependency

    'com.google.android.gms:play-services-location:15.0.0'

    Kotlin Code

    val client = FusedLocationProviderClient(this)
    val location = client.lastLocation
    location.addOnCompleteListener {
        // this is a lambda expression and we get an 'it' iterator to access the 'result'
        // it.result.latitude gives the latitude
        // it.result.longitude gives the longitude 
        val geocoder = Geocoder(applicationContext, Locale.getDefault())
        val address = geocoder.getFromLocation(it.result.latitude, it.result.longitude, 1)
        if (address != null && address.size > 0) {
            // Get the current city
            city = address[0].locality
        }
    }
    location.addOnFailureListener {
        // Some error in getting the location, let's log it
        Log.d("xtraces", it.message)
    }
    
    0 讨论(0)
  • 2020-11-21 05:07

    Now that Google Play locations services are here, I recommend that developers start using the new fused location provider. You will find it easier to use and more accurate. Please watch the Google I/O video Beyond the Blue Dot: New Features in Android Location by the two guys who created the new Google Play location services API.

    I've been working with location APIs on a number of mobile platforms, and I think what these two guys have done is really revolutionary. It's gotten rid of a huge amount of the complexities of using the various providers. Stack Overflow is littered with questions about which provider to use, whether to use last known location, how to set other properties on the LocationManager, etc. This new API that they have built removes most of those uncertainties and makes the location services a pleasure to use.

    I've written an Android app that periodically gets the location using Google Play location services and sends the location to a web server where it is stored in a database and can be viewed on Google Maps. I've written both the client software (for Android, iOS, Windows Phone and Java ME) and the server software (for ASP.NET and SQL Server or PHP and MySQL). The software is written in the native language on each platform and works properly in the background on each. Lastly, the software has the MIT License. You can find the Android client here:

    https://github.com/nickfox/GpsTracker/tree/master/phoneClients/android

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