它給了我這個錯誤(空物件參考上的雙 android.location.Location.getLatitude()')
我嘗試了許多不同的解決方案,但都是一樣的,我知道 fusedLocationClient.lastLocation 它只提供來自其他應用程式的最后一個位置,但我不想要那個,我想在沒有它的情況下獲取當前位置,因為它給出了空值?那么如何解決這個問題并獲取當前位置???
import android.Manifest
import android.content.ContentValues.TAG
import android.content.Context
import android.content.pm.PackageManager
import android.location.LocationManager
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import com.firebase.geofire.GeoFire
import com.firebase.geofire.GeoLocation
import com.firebase.geofire.GeoQueryEventListener
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.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.moapp.guardaroundd.R
import com.moapp.guardaroundd.databinding.FragmentMapBinding
import com.moapp.guardaroundd.utils.Constants.DEFAULT_ZOOM
import com.moapp.guardaroundd.utils.Constants.LOCATION_PERMISSION_REQUEST_CODE
import com.moapp.guardaroundd.utils.createAlertEnableLocation
class MapFragment : Fragment(), OnMapReadyCallback {
private lateinit var mMap: GoogleMap
private lateinit var binding: FragmentMapBinding
private lateinit var fusedLocationClient: FusedLocationProviderClient
private var mLocationPermissionsGranted = false
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout for this fragment
binding = FragmentMapBinding.inflate(layoutInflater)
val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireActivity())
return binding.root
}
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
getLocationPermission()
}
private fun isLocationEnabled(): Boolean {
val locationManager =
activity?.getSystemService(Context.LOCATION_SERVICE) as LocationManager?
return locationManager!!.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(
LocationManager.NETWORK_PROVIDER
)
}
private fun moveCamera(latLng: LatLng) {
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, DEFAULT_ZOOM))
}
private fun getLocation() {
if (isLocationEnabled()) {
try {
fusedLocationClient.lastLocation.addOnSuccessListener {
moveCamera(LatLng(it.latitude, it.longitude))
mMap.isMyLocationEnabled = true
}
} catch (ex: SecurityException) {
}
} else {
//Custom alert
createAlertEnableLocation(requireContext())
}
}
private fun getLocationPermission() {
if (ContextCompat.checkSelfPermission(
requireContext(),
Manifest.permission.ACCESS_FINE_LOCATION
)
== PackageManager.PERMISSION_GRANTED
) {
mLocationPermissionsGranted = true
getLocation()
} else {
ActivityCompat.requestPermissions(
requireActivity(), arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
LOCATION_PERMISSION_REQUEST_CODE
)
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
mLocationPermissionsGranted = false
when (requestCode) {
LOCATION_PERMISSION_REQUEST_CODE -> {
// If request is cancelled, the result arrays are empty.
if (grantResults.isNotEmpty() &&
grantResults[0] == PackageManager.PERMISSION_GRANTED
) {
mLocationPermissionsGranted = true
}
}
}
}
uj5u.com熱心網友回復:
避免這種null location情況的最簡單方法是啟動谷歌地圖應用程式并按下我的位置按鈕。然后您回傳到您的應用程式,fusedLocationClient.lastLocation這次將為您提供非空設備的最后位置。
由于您顯然不喜歡這樣做,因此您需要使用Location Updates。
為此,我會getLocation()稍微調整您的代碼。
private fun getLocation() {
// last known location from fusedLocationProviderClient returned as a task
fusedLocationProviderClient.lastLocation
//check if the last location is null
.addOnSuccessListener { lastLoc ->
if (lastLoc != null) {
// initialize lastKnownLocation from fusedLocationProviderClient
lastKnownLocation = lastLoc
moveCamera(LatLng(lastLoc.latitude, lastLoc.longitude))
} else {
//if null trigger location update to get location
fusedLocationProviderClient.requestLocationUpdates(
locationRequest, locationCallback, Looper.getMainLooper()
)
}
// in case of error Toast the error in a short Toast message
}
.addOnFailureListener {
Toast.makeText(requireActivity(), "${it.message}", Toast.LENGTH_SHORT).show()
}
}
我還需要把LocationRequest和Location Callback帶入戲中。
class MapFragment : Fragment(), OnMapReadyCallback { .......
// LOCATION COMPONENTS
private lateinit var lastKnownLocation: Location
private lateinit var fusedLocationProviderClient: FusedLocationProviderClient
private val locationRequest =
LocationRequest().apply {
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
interval = TimeUnit.SECONDS.toMillis(10)
fastestInterval = TimeUnit.SECONDS.toMillis(1)
}
private val locationCallback =
object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
super.onLocationResult(locationResult)
if (locationResult != null) {
lastKnownLocation = locationResult.lastLocation
//call the above getLocation() again to move camera
getLocation()
}
}
}
因此,只要來自 fusedClient 的最后一個已知位置為空,就會觸發更新并移動相機位置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/340895.html
標籤:安卓 安卓工作室 谷歌地图 谷歌地图-android-api-2
