我如何获取currnet位置并获取纬度,经度,并在api天气中使用它们?在此方法内部,当我想在方法lat和lon中使用该方法时,我得到了纬度和经度,因此在我壶0.0之前返回我们的默认值,但在方法内部返回lat和lon的位置导致api中的lat和lon无法正常工作]
@SuppressLint("MissingPermission")
private fun getLastLocation() {
if (checkPermissions()) {
if (isLocationEnabled()) {
mFusedLocationClient.lastLocation.addOnCompleteListener(this) { task ->
var location: Location? = task.result
if (location == null) {
requestNewLocationData()
} else {
lat=location.latitude
lon=location.longitude
Log.i("getLOc","lat is : $lat")
Log.i("getLOc","lat is : $lon")
}
}
} else {
Toast.makeText(this, "Turn on location", Toast.LENGTH_LONG).show()
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
startActivity(intent)
}
} else {
requestPermissions()
}
}
根据official documentation,在以下情况下,最新已知位置可能是空:
在这种情况下,您应该requestLocationUpdates
通过以下步骤您的最后一个已知位置永不为空。
步骤1:在清单文件中添加此权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
步骤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() } }
步骤3:创建要在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 ) }
步骤4:
确保位置已打开或用户接受打开后,在onActivityResult()
中处理回调。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() } } }
第5步:从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); }
我希望这会有所帮助。
快乐编码🤓