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

前端 未结 22 2598
梦谈多话
梦谈多话 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:00

    April 2020

    Full steps to get current location, and avoid Last Known Location nullability.

    According to official documentation, Last Known Location could be Null in case of:

    • Location is turned off in the device settings. As it clears the cache.
    • The device never recorded its location. (New device)
    • Google Play services on the device has restarted.

    In this case, you should requestLocationUpdates and receive the new location on the LocationCallback.

    By the following steps your last known Location never null.


    Pre-requisite: EasyPermission library


    Step 1: In manifest file add this permission

    
    

    Step 2:

        override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    
        //Create location callback when it's ready.
        createLocationCallback()
    
        //createing location request, how mant request would be requested.
        createLocationRequest()
    
        //Build check request location setting request
        buildLocationSettingsRequest()
    
        //FusedLocationApiClient which includes location 
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
        //Location setting client
        mSettingsClient = LocationServices.getSettingsClient(this)
    
        //Check if you have ACCESS_FINE_LOCATION permission
        if (!EasyPermissions.hasPermissions(
                this@MainActivity,
                Manifest.permission.ACCESS_FINE_LOCATION)) {
            requestPermissionsRequired()
        }
        else{
            //If you have the permission we should check location is opened or not
            checkLocationIsTurnedOn()
        }
    
    }
    

    Step 3: Create required functions to be called in onCreate()

    private fun requestPermissionsRequired() {
        EasyPermissions.requestPermissions(
            this,
            getString(R.string.location_is_required_msg),
            LOCATION_REQUEST,
            Manifest.permission.ACCESS_FINE_LOCATION
        )
    }
    
    private fun createLocationCallback() {
        //Here the location will be updated, when we could access the location we got result on this callback.
        mLocationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult) {
                super.onLocationResult(locationResult)
                mCurrentLocation = locationResult.lastLocation
            }
        }
    }
    
    private fun buildLocationSettingsRequest() {
        val builder = LocationSettingsRequest.Builder()
        builder.addLocationRequest(mLocationRequest!!)
        mLocationSettingsRequest = builder.build()
        builder.setAlwaysShow(true)
    }
    
    private fun createLocationRequest() {
        mLocationRequest = LocationRequest.create()
        mLocationRequest!!.interval = 0
        mLocationRequest!!.fastestInterval = 0
        mLocationRequest!!.numUpdates = 1
        mLocationRequest!!.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
    }
    
    public fun checkLocationIsTurnedOn() { // Begin by checking if the device has the necessary location settings.
        mSettingsClient!!.checkLocationSettings(mLocationSettingsRequest)
            .addOnSuccessListener(this) {
                Log.i(TAG, "All location settings are satisfied.")
                startLocationUpdates()
            }
            .addOnFailureListener(this) { e ->
                val statusCode = (e as ApiException).statusCode
                when (statusCode) {
                    LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> {
                        try {
                            val rae = e as ResolvableApiException
                            rae.startResolutionForResult(this@MainActivity, LOCATION_IS_OPENED_CODE)
                        } catch (sie: IntentSender.SendIntentException) {
                        }
                    }
                    LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> {
                        mRequestingLocationUpdates = false
                    }
                }
            }
    }
    
    private fun startLocationUpdates() {
        mFusedLocationClient!!.requestLocationUpdates(
            mLocationRequest,
            mLocationCallback, null
        )
    }
    

    Step 4:

    Handle callbacks in onActivityResult() after ensuring the location is opened or the user accepts to open it in.

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            LOCATION_IS_OPENED_CODE -> {
                if (resultCode == AppCompatActivity.RESULT_OK) {
                    Log.d(TAG, "Location result is OK")
                } else {
                    activity?.finish()
                }
            }
    }
    

    Step 5: Get last known location from FusedClientApi

    override fun onMapReady(map: GoogleMap) {
        mMap = map
        mFusedLocationClient.lastLocation.addOnSuccessListener {
            if(it!=null){
                locateUserInMap(it)
            }
        }
    
    }
       private fun locateUserInMap(location: Location) {
        showLocationSafetyInformation()
        if(mMap!=null){
            val currentLocation = LatLng(location.latitude,location.longitude )
            addMarker(currentLocation)
        }
    }
    
    
    private fun addMarker(currentLocation: LatLng) {
        val cameraUpdate = CameraUpdateFactory.newLatLng(currentLocation)
        mMap?.clear()
        mMap?.addMarker(
            MarkerOptions().position(currentLocation)
                .title("Current Location")
        )
        mMap?.moveCamera(cameraUpdate)
        mMap?.animateCamera(cameraUpdate)
        mMap?.setMinZoomPreference(14.0f);
    }
    

    I hope this would help.

    Happy Coding

提交回复
热议问题