【发布时间】:2021-11-05 05:05:29
【问题描述】:
我正在尝试获取当前位置,但是应用程序崩溃是因为应用程序发现了 lateinit 属性尚未初始化,因为该应用程序尚未请求 GPS 的用户许可以获取当前位置。
下面是代码:
class FirstFragment : Fragment(), OnMapReadyCallback{
private var _binding: FragmentFirstBinding? = null
private val binding get() = _binding!!
private lateinit var currentLocation: Location
private lateinit var fusedLocationProvider: FusedLocationProviderClient
private val permissionCode = 101
private lateinit var googleMap: GoogleMap
private val MasjidZahir = com.google.android.gms.maps.model.LatLng(6.1046784,100.3716608)
private val Jabil = com.google.android.gms.maps.model.LatLng(5.3267065,100.2820637)
private val TARUCKL = com.google.android.gms.maps.model.LatLng(3.2162302,101.7267724)
private val TARUCPG = com.google.android.gms.maps.model.LatLng(5.4532105,100.2826858)
private val MARINA = com.google.android.gms.maps.model.LatLng(1.3149938,103.890498)
private var locationArrayList: ArrayList<com.google.android.gms.maps.model.LatLng>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
fusedLocationProvider = LocationServices.getFusedLocationProviderClient(requireActivity())
fetchLocation()
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val map = binding.mapView
mapView.onCreate(savedInstanceState)
mapView.onResume()
mapView.getMapAsync(this)
locationArrayList = ArrayList()
locationArrayList!!.add(MasjidZahir)
locationArrayList!!.add(Jabil)
locationArrayList!!.add(TARUCKL)
locationArrayList!!.add(TARUCPG)
locationArrayList!!.add(MARINA)
}
private fun fetchLocation(){
if (ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(requireActivity(), arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), permissionCode)
return
}
val task = fusedLocationProvider.lastLocation
task.addOnSuccessListener { location ->
if(location != null){
currentLocation = location
Toast.makeText(this.context, currentLocation.latitude.toString() + " "
+ currentLocation.longitude.toString(), Toast.LENGTH_SHORT).show()
}
}
}
override fun onMapReady(map: GoogleMap) {
googleMap = map
for(i in locationArrayList!!.indices){
googleMap.addMarker(MarkerOptions().position(locationArrayList!![i]).title("Marker $i"))
googleMap.animateCamera(CameraUpdateFactory.zoomTo(18.0f))
googleMap.moveCamera(CameraUpdateFactory.newLatLng(locationArrayList!![i]))
}
// Here is the problem
val latLng = com.google.android.gms.maps.model.LatLng(currentLocation.latitude, currentLocation.longitude)
val markerOptions = MarkerOptions().position(latLng).title("Current Location")
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 16.0f))
googleMap.addMarker(markerOptions)
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when(requestCode){
permissionCode -> if (grantResults.isEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED){
fetchLocation()
}
}
}
如何防止应用崩溃,或者让 onMapReady() 先等待用户的权限请求,然后再将当前位置标记放到地图上?
【问题讨论】:
-
此处 currentLocation 属性未初始化
标签: android google-maps kotlin