获取已使用的位置提供程序客户端返回用户位置的空纬度和经度值



对于我正在制作的应用程序,我需要获得用户的位置,然后在地图上显示。

为了实现这一点,我在下面的代码中使用LocationServices.getFusedLocationProviderClient()。

当我在addOnSuccessListener中获得位置值时,纬度和经度值由于某种原因是空的,所以我得到一个NullPointerException:

import android.Manifest
import android.annotation.SuppressLint
import android.location.Location
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.MarkerOptions
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.realtomjoney.mapsapp.databinding.ActivityMainBinding
import java.lang.NullPointerException
class MainActivity : AppCompatActivity(), OnMapReadyCallback {
private lateinit var binding: ActivityMainBinding
lateinit var myMap: GoogleMap
lateinit var fusedLocation: FusedLocationProviderClient
@SuppressLint("MissingPermission")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
ActivityCompat.requestPermissions(this, arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION) , 100)
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
binding.button2.setOnClickListener {
fusedLocation = LocationServices.getFusedLocationProviderClient(this)
fusedLocation.lastLocation.addOnSuccessListener { location: Location? ->
val latLong = LatLng(location!!.latitude, location.longitude)
myMap.addMarker(MarkerOptions().position(latLong).title("Found Location"))
myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLong, 10f))
}
}
}
override fun onMapReady(p0: GoogleMap) {
myMap = p0
}
}

当我运行应用程序时,我得到以下异常:

2021-10-19 16:46:09.859 8556-8556/com.realtomjoney.mapsapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.realtomjoney.mapsapp, PID: 8556
java.lang.NullPointerException
at com.realtomjoney.mapsapp.MainActivity.onCreate$lambda-1$lambda-0(MainActivity.kt:46)
at com.realtomjoney.mapsapp.MainActivity.$r8$lambda$wwcxhtPyugLtHLn65vCEt3JY33Q(Unknown Source:0)
at com.realtomjoney.mapsapp.MainActivity$$ExternalSyntheticLambda1.onSuccess(Unknown Source:4)
at com.google.android.gms.tasks.zzn.run(com.google.android.gms:play-services-tasks@@17.2.0:4)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7842)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

是的,当我第一次运行应用程序时,我已经对所有权限说了是。

如果这个问题写得不好或重复,请让我知道,因为我努力创造好的和结构良好的问题。

我也遇到过这个问题,特别是当我第一次在设备上安装我的应用程序时。有两件事你可以尝试一下,我认为会有帮助:

一个试图打开谷歌地图应用程序,等待它得到修复,然后继续打开你的应用程序。这应该为你的融合位置提供商客户端提供一个它可以查找的最后位置。查看此答案以供参考

则更进一步,使用提供程序请求位置更新。如果你只需要一个位置修复,那么你可以在得到第一个位置修复后注销它。我这样做我的应用程序,通常最后的位置是空的,我第一次使用安装后的应用程序。在那之后,它通常是有效的。这可能是你应该做的,因为你不能指望你的用户在使用你的应用程序之前打开谷歌地图。

,只是为了安全,要知道,fusedlocationproviderclient有时停止工作或行为奇怪,当你的设备上有等待的谷歌服务更新。因此,请继续确保您的设备在这方面是最新的。

lastLocation可以为空,有几个原因。它们列在这里https://developer.android.com/training/location/retrieve-current#last-known

首先,在初始化用户坐标到map时不获得null的正确过程是在onConnected()回调上初始化map,而不是在活动或片段中的onCreate(), lastLocation可以为null。

你可以使用REQUEST_CODE_ASK_PERMISSIONS来处理回调如果不使用位置观察者,位置观察者基本上看起来像这样

if (location.provider == LocationManager.GPS_PROVIDER) {
getData()
}

我以前遇到过同样的情况,我的代码在权限回调时是这样的:

if (isGranted()) {
try {
fusedLocationProviderClient.lastLocation.addOnCompleteListener {
if (it.isSuccessful) {
if (it.result != null) {
setLocationData(it.result)
}
}
}
} catch (e: Exception) {
}

基本上在Permission授予时,它会得到你的位置你可以选择是否要用它来addMarker或者其他任何东西

我也有同样的问题

  1. 检查设备上的gps是否打开
  2. 可能是因为你正在使用的谷歌地图api密钥的账单检查所有这些,有时错误日志显示谷歌地图计费问题

看起来你请求权限(ActivityCompat.requestPermissions(…)),但从不处理权限请求(你需要覆盖onRequestPermissionsResult(…))。更多信息:https://developer.android.com/training/permissions/requesting#manage-request-code-yourself

或者您可以切换到新的方法来允许系统管理请求代码:https://developer.android.com/training/permissions/requesting#allow-system-manage-request-code

最后一点,在某些情况下getLastLocation()可以返回null,在这种情况下,我调用getCurrentLocation()它总是返回新的设备位置,更多信息在这里:https://developer.android.com/training/location/retrieve-current#BestEstimate

最新更新